كيفية تمرير وسيطات سطر الأوامر إلى عملية قيد التشغيل على أنظمة يونكس/لينكس؟
سؤال
على SunOS هناك pargs
الأمر الذي يطبع وسيطات سطر الأوامر التي تم تمريرها إلى العملية الجارية.
هل يوجد أي أمر مماثل في بيئات Unix الأخرى؟
المحلول
وهناك عدة خيارات:
ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo
وهناك المزيد من المعلومات في /proc/<pid>
على لينكس، يكون مجرد نظرة.
في الأشياء من Unixes أخرى قد تكون مختلفة. والأمر ps
تعمل في كل مكان، والاشياء /proc
هو OS محددة. على سبيل المثال على AIX ليس هناك cmdline
في /proc
.
نصائح أخرى
وهذا سوف تفعل خدعة:
xargs -0 < /proc/<pid>/cmdline
وبدون xargs، لن يكون هناك فراغات بين الحجج، لأنها تم تحويلها إلى NULs.
فلكس كامل
لينكس ويونكس نظام يمكنك استخدام ps -ef | grep process_name
للحصول على سطر الأوامر الكامل.
في أنظمة صن أو. إس، إذا كنت ترغب في الحصول على سطر الأوامر الكامل، يمكنك استخدام
/usr/ucb/ps -auxww | grep -i process_name
للحصول على سطر الأوامر الكامل ما تحتاجه لتصبح سوبر المستخدم.
قائمة الحجج
pargs -a PROCESS_ID
وسيعطي قائمة مفصلة من الحجج التي تم تمريرها إلى عملية. أنه سيتم إخراج مجموعة من الحجج في مثل هذا:
argv[o]: first argument
argv[1]: second..
argv[*]: and so on..
ولم أجد أي أمر مماثل لينكس، ولكن أود أن استخدم الأمر التالي للحصول على إخراج مشابه:
tr '\0' '\n' < /proc/<pid>/environ
على لينكس
cat /proc/<pid>/cmdline
تحصل على سطر الأوامر للعملية (بما في ذلك الوسائط) ولكن مع تغيير جميع المسافات البيضاء إلى أحرف NUL.
ويمكنك استخدام pgrep
مع -f
(سطر الأوامر الكامل) و-l
(وصف الطويل):
pgrep -l -f PatternOfProcess
وهذه الطريقة لها فرقا حاسما مع أي من الاستجابات الأخرى: يعمل على سيغوين م>، لذلك يمكنك استخدامه للحصول على سطر الأوامر الكامل لأي عملية تشغيل ويندوز (تنفيذ ك <لأ href = "https://superuser.com/questions/728810/how-do-you-open-the- الأوامر الفوري في ويندوز-7-مع-الاختصار مفتاح / 728824 # 728824 "> مرتفعة إذا كنت تريد بيانات عن أي عملية مرتفعة / المشرف). أي طريقة أخرى للقيام بذلك على ويندوز هو أكثر صعوبة، <وأ href = "https://stackoverflow.com/questions/17563411/how-to-get-command-line-info-for-a-process-in-powershell -أو-ج-الحادة / 17582576 # 17582576 "> على سبيل المثال .
وعلاوة على ذلك: في بلدي التجارب، وكان الطريق pgrep على النظام الوحيد الذي عملت لحصول على المسار الكامل ل <م> تشغيل البرامج النصية داخل الثعبان سيغوين وم>
والبديل الآخر من /proc/PID/cmdline
الطباعة مع المساحات في لينكس هو:
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
في هذه الطريقة طباعة cat
الأحرف NULL كما ^@
ثم استبدالها الفضاء باستخدام sed
. echo
طباعة سطر جديد.
وبدلا من استخدام أوامر متعددة لتحرير تيار، ومجرد استخدام واحد - آر يترجم حرف واحد إلى آخر:
tr '\0' ' ' </proc/<pid>/cmdline
وبالإضافة إلى كل الطرق المذكورة أعلاه لتحويل النص، إذا كنت ببساطة استخدام "الجمل"، وستجعل الإخراج على خطوط منفصلة افتراضيا. مع الاستفادة أضاف أنه يمكن أيضا منع أي حرف التي قد يتبارى محطة من الظهور.
وكلا الانتاج في أمر واحد:
وسلاسل / إجراءات // cmdline / إجراءات // البيئى
والسؤال الحقيقي هو ... هل هناك طريقة لمعرفة سطر الأوامر الحقيقي للعملية في لينكس التي تم تعديلها بحيث يحتوي على cmdline النص تغيير بدلا من الأمر الفعلي الذي تم تشغيله.
في سولاريس
ps -eo pid,comm
ومماثل يمكن استخدامها على يونكس مثل أنظمة.
في لينكس، مع باش، لإخراج كما وسائط نقل حتى تتمكن من تحرير الأمر ثم أعد ذلك
</proc/"${pid}"/cmdline xargs --no-run-if-empty -0 -n1 \
bash -c 'printf "%q " "${1}"' /dev/null; echo
في سولاريس، مع باش (اختبار مع 3.2.51 (1) -release) ودون يوزرلاند جنو:
IFS=$'\002' tmpargs=( $( pargs "${pid}" \
| /usr/bin/sed -n 's/^argv\[[0-9]\{1,\}\]: //gp' \
| tr '\n' '\002' ) )
for tmparg in "${tmpargs[@]}"; do
printf "%q " "$( echo -e "${tmparg}" )"
done; echo
ولينكس باش مثال (لصق في محطة):
{
## setup intial args
argv=( /bin/bash -c '{ /usr/bin/sleep 10; echo; }' /dev/null 'BEGIN {system("sleep 2")}' "this is" \
"some" "args "$'\n'" that" $'\000' $'\002' "need" "quot"$'\t'"ing" )
## run in background
"${argv[@]}" &
## recover into eval string that assigns it to argv_recovered
eval_me=$(
printf "argv_recovered=( "
</proc/"${!}"/cmdline xargs --no-run-if-empty -0 -n1 \
bash -c 'printf "%q " "${1}"' /dev/null
printf " )\n"
)
## do eval
eval "${eval_me}"
## verify match
if [ "$( declare -p argv )" == "$( declare -p argv_recovered | sed 's/argv_recovered/argv/' )" ];
then
echo MATCH
else
echo NO MATCH
fi
}
وإخراج:
MATCH
وسولاريس باش مثال:
{
## setup intial args
argv=( /bin/bash -c '{ /usr/bin/sleep 10; echo; }' /dev/null 'BEGIN {system("sleep 2")}' "this is" \
"some" "args "$'\n'" that" $'\000' $'\002' "need" "quot"$'\t'"ing" )
## run in background
"${argv[@]}" &
pargs "${!}"
ps -fp "${!}"
declare -p tmpargs
eval_me=$(
printf "argv_recovered=( "
IFS=$'\002' tmpargs=( $( pargs "${!}" \
| /usr/bin/sed -n 's/^argv\[[0-9]\{1,\}\]: //gp' \
| tr '\n' '\002' ) )
for tmparg in "${tmpargs[@]}"; do
printf "%q " "$( echo -e "${tmparg}" )"
done; echo
printf " )\n"
)
## do eval
eval "${eval_me}"
## verify match
if [ "$( declare -p argv )" == "$( declare -p argv_recovered | sed 's/argv_recovered/argv/' )" ];
then
echo MATCH
else
echo NO MATCH
fi
}
وإخراج:
MATCH
ويمكنك ببساطة استخدام:
ps -o args= -f -p ProcessPid
جرب "ps -n" في محطة Linux.سيظهر هذا:
1. جميع العمليات قيد التشغيل، وسطر الأوامر الخاص بها، وأرقام التعريف الشخصية (PIDs) الخاصة بها
- يبدأ البرنامج العمليات.
بعد ذلك ستعرف العملية التي يجب قتلها
إذا كنت ترغب في الحصول على فترة طويلة كما هو وممكن (لست متأكدا ما يحد من هناك)، على غرار سولاريس '<لأ href = "https://docs.oracle.com/cd/E19683-01/806- 5202 / 6je7shk59 / index.html و"يختلط =" نوفولو noreferrer "> pargs ، يمكنك استخدام هذا على لينكس و OSX:
ps -ww -o pid,command [-p <pid> ... ]