जवाबों:
कई विकल्प हैं:
ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo
/proc/<pid>
लिनक्स पर अधिक जानकारी है , बस एक नज़र है।
अन्य Unixes पर चीजें अलग हो सकती हैं। ps
आदेश हर जगह काम करेंगे, /proc
सामान ओएस विशिष्ट है। उदाहरण के लिए AIX में कोई नहीं cmdline
है /proc
।
ps -ww -fp <pid>
विस्तृत आउटपुट निर्दिष्ट करने के लिए -w (यानी ) की आवश्यकता होगी क्योंकि यदि कई कमांड हैं, तो वे कट ऑफ प्राप्त कर सकते हैं।
-ww
(के रूप में ज्यादा के रूप में कर्नेल द्वारा संग्रहीत किया जाता है) विकल्प पूर्ण कमांड लाइन तर्क के लिए उपयोग की अनुमति देता है। यह भी देखें: सोलारिस और bsd को प्रक्रिया और पीएस विकल्पों के
cat /proc/<pid>/cmdline
साइगविन पर भी काम करता है, जहां ps
किसी भी विकल्प के साथ cmd लाइन तर्क नहीं दिखाए गए हैं ।
args
कमांड प्राप्त करने की आवश्यकता है , तो कमांड है ps -o args -p <pid>
और यह केवल args
या -ओ का उपयोग करने के लिए प्रिंट करेगा cmd
यदि आपको केवल देखने की आवश्यकता है cmd
। पढ़ने की कोशिश /proc/<pid>/cmdline
हमेशा अनपेक्षित उपयोगकर्ताओं के लिए काम नहीं करेगी। ps
उपयोगिता काम करेंगे।
/proc/<pid>/cmdline
सीमित है (PAGE_SIZE कर्नेल पैरामीटर के मान को हार्ड कोडित किया गया है), अब लंबी कमांड लाइनों को अभी भी छोटा दिखाया गया है! अधिक जानकारी के लिए stackoverflow.com/questions/199130/… देखें । आप अपनी कर्नेल सेटिंग को क्वेरी कर सकते हैं getconf PAGE_SIZE
, यह आमतौर पर 4096 है।
यह चाल चलेगा:
xargs -0 < /proc/<pid>/cmdline
Xargs के बिना, तर्कों के बीच कोई स्थान नहीं होगा, क्योंकि उन्हें NUL में बदल दिया गया है।
xargs -0 < /proc/<pid>/cmdline
।
लिनक्स और यूनिक्स प्रणाली के लिए आप 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
पर लिनक्स
cat /proc/<pid>/cmdline
आपको प्रक्रिया की कमांडलाइन मिलती है (args सहित) लेकिन सभी व्हाट्सएप के साथ NUL वर्णों में परिवर्तित हो जाते हैं।
आप (पूर्ण कमांड लाइन) और (लंबे विवरण) के 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 नाम प्रिंट करता है।
/proc/PID/cmdline
लिनक्स में रिक्त स्थान के साथ मुद्रण का एक और प्रकार है:
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
इस तरह से NULL वर्णों को cat
प्रिंट करता है और फिर आप उन्हें एक स्थान का उपयोग करके प्रतिस्थापित करते हैं ; एक नई रेखा प्रिंट करता है।^@
sed
echo
पाठ को रूपांतरित करने के लिए उपरोक्त सभी तरीकों के अलावा, यदि आप केवल 'स्ट्रिंग्स' का उपयोग करते हैं, तो यह आउटपुट को अलग-अलग लाइनों पर डिफ़ॉल्ट रूप से बनाएगा। अतिरिक्त लाभ के साथ यह किसी भी वर्ण को रोक सकता है जो आपके टर्मिनल को दिखने से रोक सकता है।
एक कमांड में दोनों आउटपुट:
स्ट्रिंग्स / proc // cmdline / proc // environ
असली सवाल यह है ... क्या लिनक्स में एक प्रक्रिया की वास्तविक कमांड लाइन को देखने का एक तरीका है जिसे बदल दिया गया है ताकि cmdline में वास्तविक कमांड के बजाय परिवर्तित पाठ हो।
लिनक्स पर, बैश के साथ, उद्धृत आलों के रूप में आउटपुट करने के लिए ताकि आप कमांड को संपादित कर सकें और इसे पुन: चला सकें
</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
tr \\0 ' ' < /proc/<pid>/cmdline