यूनिक्स / लाइनक्स सिस्टम पर चलने वाली प्रक्रिया को कमांड लाइन आर्ग्स कैसे प्राप्त करें?


202

SunOS पर ऐसी pargsकमांड होती है जो रनिंग प्रक्रिया में पास की गई कमांड लाइन की दलीलों को प्रिंट करती है।

क्या अन्य यूनिक्स वातावरण पर कोई समान कमांड है?


4
tr \\0 ' ' < /proc/<pid>/cmdline
दिमित्री ग्रिगोरीव

जवाबों:


307

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

ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo

/proc/<pid>लिनक्स पर अधिक जानकारी है , बस एक नज़र है।

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


49
लिनक्स पर, आपको संभवतः ps -ww -fp <pid>विस्तृत आउटपुट निर्दिष्ट करने के लिए -w (यानी ) की आवश्यकता होगी क्योंकि यदि कई कमांड हैं, तो वे कट ऑफ प्राप्त कर सकते हैं।
6:59

2
-ww(के रूप में ज्यादा के रूप में कर्नेल द्वारा संग्रहीत किया जाता है) विकल्प पूर्ण कमांड लाइन तर्क के लिए उपयोग की अनुमति देता है। यह भी देखें: सोलारिस और bsd को प्रक्रिया और पीएस विकल्पों के
गुरू

3
cat /proc/<pid>/cmdlineसाइगविन पर भी काम करता है, जहां psकिसी भी विकल्प के साथ cmd लाइन तर्क नहीं दिखाए गए हैं ।
lechup

3
लिनक्स पर, यदि आपको केवल argsकमांड प्राप्त करने की आवश्यकता है , तो कमांड है ps -o args -p <pid>और यह केवल argsया -ओ का उपयोग करने के लिए प्रिंट करेगा cmdयदि आपको केवल देखने की आवश्यकता है cmd। पढ़ने की कोशिश /proc/<pid>/cmdlineहमेशा अनपेक्षित उपयोगकर्ताओं के लिए काम नहीं करेगी। psउपयोगिता काम करेंगे।
अल्विट्स

2
संकेत: की लंबाई /proc/<pid>/cmdlineसीमित है (PAGE_SIZE कर्नेल पैरामीटर के मान को हार्ड कोडित किया गया है), अब लंबी कमांड लाइनों को अभी भी छोटा दिखाया गया है! अधिक जानकारी के लिए stackoverflow.com/questions/199130/… देखें । आप अपनी कर्नेल सेटिंग को क्वेरी कर सकते हैं getconf PAGE_SIZE, यह आमतौर पर 4096 है।
t0r0X

61

यह चाल चलेगा:

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

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


3
इसे छोटा किया जा सकता है xargs -0 < /proc/<pid>/cmdline
slm

यह मेरे उत्पादन को छोटा कर रहा है। कोई सलाह?
जॉनसम

कभी किसी छंटनी पर ध्यान नहीं दिया - क्या आप एक उदाहरण दे सकते हैं?
माइकल बॉकलिंग

इस तरह, आप यह नहीं कह सकते हैं कि यह एक इनलाइन स्पेस या एक तर्क सीमा है।
ivan_pozdeev 11:28

19

फुल कमांडलाइन

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

SunOS सिस्टम पर, यदि आप पूर्ण कमांड लाइन प्राप्त करना चाहते हैं, तो आप उपयोग कर सकते हैं

/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

14

पर लिनक्स

cat /proc/<pid>/cmdline

आपको प्रक्रिया की कमांडलाइन मिलती है (args सहित) लेकिन सभी व्हाट्सएप के साथ NUL वर्णों में परिवर्तित हो जाते हैं।


3
व्हॉट्सएप को हटाया नहीं गया है, इसे NUL के साथ बदल दिया गया है।
बोंडलान

@bdonlan आह, मैंने वह चेक नहीं किया। अच्छी पकड़!
लोथर

4
xargs -0 इको </ proc / <pid> / cmdline। आप इसे / proc / <pid> / environ के साथ भी कर सकते हैं, हालाँकि आप इसके लिए n-1 जोड़ना चाहते हैं।
दोपहर

मेरे सिस्टम पर फ़ाइल सिस्टम नहीं है :( कोई अन्य समाधान?
हेमंत

मेरा एक जावा प्रक्रिया है जिसमें लंबे लंबे लंबे पैरामीटर हैं। यह मेरे उत्पादन को छोटा कर रहा है। कोई सलाह?
जॉनसम

14

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

pgrep -l -f PatternOfProcess

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


यह वास्तव में मूल निष्पादन योग्य नाम को भी प्रिंट करता है:$ exec -a fakename bash & [1] 14102 [1]+ Stopped exec -a fakename bash $ xargs -0 < /proc/14102/cmdline; fakename $ pgrep -l -f fakename; 14102 bash
अनहैमर

का उपयोग कर मेरे लिए काम नहीं करता है pgrep from procps-ng 3.3.15और 3.3.12। बस तर्कों के बिना pid और prorgam नाम प्रिंट करता है।
सोकोवई

4

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

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

इस तरह से NULL वर्णों को catप्रिंट करता है और फिर आप उन्हें एक स्थान का उपयोग करके प्रतिस्थापित करते हैं ; एक नई रेखा प्रिंट करता है।^@sedecho


FYI करें, आप cat -v / proc / PID / cmdline का भी उपयोग कर सकते हैं sed 's / \ ^ @ / \ n / g' । यह एक नए चरित्र के साथ अशक्त चरित्र को बदल देगा। ऐसा करने पर, प्रत्येक तर्क को उसकी अपनी पंक्ति में मुद्रित किया जाएगा। इस तरह, एक तर्क को दूसरे से कहना आसान है।
TSJNachos117

2

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

ps -o args= -f -p ProcessPid

2

धारा को संपादित करने के लिए कई आदेशों का उपयोग करने के बजाय, बस एक का उपयोग करें - tr दूसरे में एक वर्ण का अनुवाद करता है:

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

1

पाठ को रूपांतरित करने के लिए उपरोक्त सभी तरीकों के अलावा, यदि आप केवल 'स्ट्रिंग्स' का उपयोग करते हैं, तो यह आउटपुट को अलग-अलग लाइनों पर डिफ़ॉल्ट रूप से बनाएगा। अतिरिक्त लाभ के साथ यह किसी भी वर्ण को रोक सकता है जो आपके टर्मिनल को दिखने से रोक सकता है।

एक कमांड में दोनों आउटपुट:

स्ट्रिंग्स / proc // cmdline / proc // environ

असली सवाल यह है ... क्या लिनक्स में एक प्रक्रिया की वास्तविक कमांड लाइन को देखने का एक तरीका है जिसे बदल दिया गया है ताकि cmdline में वास्तविक कमांड के बजाय परिवर्तित पाठ हो।


1

सोलारिस पर

     ps -eo pid,comm

सिस्टम की तरह यूनिक्स पर समान का उपयोग किया जा सकता है।


1

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

</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

0

यदि आप एक लंबे समय से संभव के रूप में प्राप्त करना चाहते हैं (यह निश्चित नहीं है कि सीमाएं क्या हैं), तो सोलारिस के पार्स के समान , आप लिनक्स और ओएसएक्स पर इसका उपयोग कर सकते हैं:

ps -ww -o pid,command [-p <pid> ... ]

-1

ps -nएक लिनक्स टर्मिनल में प्रयास करें । यह दिखाएगा:

1. सभी प्रक्रियाओं चल रहा है , उनके आदेश पंक्ति और उनके PIDs

  1. कार्यक्रम प्रक्रियाओं को एकीकृत करता है।

बाद में आपको पता चलेगा कि किस प्रक्रिया को मारना है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.