linux ऑपर यूनिक्स/लिनक्स सिस्टम पर चल रही प्रक्रिया में पास की गई कमांड लाइन तर्क कैसे प्राप्त करें?




लिनक्स के फायदे (10)

pargs पर pargs कमांड होता है जो कमांड लाइन तर्कों को चलती प्रक्रिया में पास करता है।

क्या अन्य यूनिक्स वातावरण पर कोई समान आदेश है?


स्ट्रीम को संपादित करने के लिए एकाधिक कमांड का उपयोग करने के बजाय, केवल एक-tr का उपयोग एक वर्ण को दूसरे वर्ण में करें:

tr '\0' ' ' </proc/<pid>/cmdline

कई विकल्प हैं:

ps -fp <pid>
cat /proc/<pid>/cmdline

लिनक्स पर /proc/<pid> में और जानकारी है, बस एक नज़र डालें।

अन्य यूनिक्स पर चीजें अलग हो सकती हैं। ps कमांड हर जगह काम करेगा, /proc सामान ओएस विशिष्ट है। उदाहरण के लिए AIX पर /proc cmdline में कोई cmdline नहीं है।


आप pgrep उपयोग -f (पूर्ण कमांड लाइन) और -l (लंबा विवरण) के साथ कर सकते हैं:

pgrep -l -f PatternOfProcess

इस विधि में किसी अन्य प्रतिक्रिया के साथ एक महत्वपूर्ण अंतर है: यह CygWin पर काम करता है, ताकि आप Windows के तहत चल रहे किसी भी प्रक्रिया की पूर्ण कमांड लाइन प्राप्त करने के लिए इसका उपयोग कर सकें (यदि आप किसी भी उन्नत / व्यवस्थापक प्रक्रिया के बारे में डेटा चाहते हैं तो elevated रूप में निष्पादित करें) । उदाहरण के लिए , विंडोज़ पर ऐसा करने के लिए कोई और तरीका अधिक अजीब है।
इसके अलावा: मेरे परीक्षणों में, pgrep रास्ता एकमात्र ऐसा सिस्टम रहा है जो सिगविन के अजगर के अंदर चल रही स्क्रिप्ट के लिए पूर्ण पथ प्राप्त करने के लिए काम करता है।


आप बस उपयोग कर सकते हैं:

ps -o args= -f -p ProcessPid

लिनक्स में रिक्त स्थान के साथ मुद्रण /proc/PID/cmdline का एक और संस्करण है:

cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo

इस तरह cat रूप में NULL वर्णों को प्रिंट करता है ^@ और फिर आप उन्हें sed का उपयोग करके एक स्थान के साथ बदलते हैं; echo प्रिंट एक नई लाइन।


लिनक्स पर

cat /proc/<pid>/cmdline

आपको प्रक्रिया की कमांडलाइन मिलती है (तर्क सहित) लेकिन सभी सफेद जगहों के साथ एनयूएल अक्षरों में बदल दिया गया है।


लिनक्स और यूनिक्स सिस्टम के लिए आप ps -ef | grep process_name उपयोग कर सकते हैं ps -ef | grep process_name पूर्ण कमांड लाइन प्राप्त करने के लिए,

सनोस सिस्टम पर यदि आप पूर्ण कमांड लाइन प्राप्त करना चाहते हैं तो आप /usr/ucb/ps -auxww | grep -i process_name उपयोग कर सकते हैं /usr/ucb/ps -auxww | grep -i process_name । सुनिश्चित करें कि SunOSto में पूर्ण कमांड लाइन प्राप्त करें जिसे आपको सुपर उपयोगकर्ता बनने की आवश्यकता है।

pargs -a PROCESS_ID । यह प्रक्रिया में पारित तर्कों की एक विस्तृत सूची देगा। यह argv [o] जैसे आउटपुट में तर्कों की सरणी देगा: पहला argumen argv [1]: दूसरा .. तो ..

मुझे कोई भी समान कमांड नहीं मिला लेकिन मैं लिनक्स पर्यावरण पर उस tr '\0' '\n' < /proc/<pid>/environ जैसे बाहर निकलने के लिए निम्न आदेश दूंगा।


यह चाल करेगा:

xargs -0 < /proc/<pid>/cmdline

Xargs के बिना, तर्कों के बीच कोई रिक्त स्थान नहीं होगा, क्योंकि उन्हें एनयूएल में परिवर्तित कर दिया गया है।


लिनक्स पर, बैश के साथ, उद्धृत तर्क के रूप में आउटपुट करने के लिए ताकि आप कमांड को संपादित कर सकें और इसे फिर से चालू कर सकें

</proc/"${pid}"/cmdline xargs --no-run-if-empty -0 -n1 \
    bash -c 'printf "%q " "${1}"' /dev/null; echo

सोलारिस पर, बैश के साथ (3.2.51 (1) -release के साथ परीक्षण किया गया) और gnu उपयोगकर्तालैंड के बिना:

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

Solaris पर

     ps -eo pid,comm

यूनिक्स जैसे सिस्टम पर समान इस्तेमाल किया जा सकता है।







sunos