كيفية تمرير وسيطات سطر الأوامر إلى عملية قيد التشغيل على أنظمة يونكس/لينكس؟

StackOverflow https://stackoverflow.com/questions/821837

سؤال

على 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) الخاصة بها

  1. يبدأ البرنامج العمليات.

بعد ذلك ستعرف العملية التي يجب قتلها

إذا كنت ترغب في الحصول على فترة طويلة كما هو وممكن (لست متأكدا ما يحد من هناك)، على غرار سولاريس '<لأ href = "https://docs.oracle.com/cd/E19683-01/806- 5202 / 6je7shk59 / index.html و"يختلط =" نوفولو noreferrer "> pargs ، يمكنك استخدام هذا على لينكس و OSX:

ps -ww -o pid,command [-p <pid> ... ]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top