एक प्रक्रिया से पूरी कमांड लाइन कैसे प्राप्त करें?


43

मैं अपने प्रक्रिया नाम का उपयोग करके एक रनिंग प्रोसेस से कमांड तर्क या पूरी कमांड लाइन कैसे प्राप्त कर सकता हूं?

उदाहरण के लिए यह प्रक्रिया:

# ps
PID   USER     TIME   COMMAND
 1452 root       0:00 /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid

और जो मैं चाहता हूं वह है /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pidया तर्क। मैं प्रक्रिया का नाम जानता हूं और इसके तर्क चाहता हूं। मैं SliTaz पर बिजीबॉक्स का उपयोग कर रहा हूं।


क्या आप आउटपुट ps(अनुशंसित नहीं) से संसाधित करना चाहते हैं या क्या आप कुछ वैकल्पिक कमांड की तलाश कर रहे हैं psजो आपको आउटपुट देगा? psआउटपुट की कई लाइनें देने पर क्या करने की आवश्यकता है ? सभी / पहला / अंतिम प्रिंट?
एन्थॉन

1
आप किस ऑपरेटिंग सिस्टम का उपयोग करते हैं?
सायरस

मैंने अपना प्रश्न संपादित किया। मैं प्रक्रिया का नाम जानता हूं और इसके तर्क चाहता हूं। मैं व्यस्त बॉक्स के साथ SliTaz (न्यूनतर लिनक्स) का उपयोग कर रहा हूं।
माइकल

@ मिचेल क्या आपने @ जोहान जवाब के अनुसार कोशिश argकी है ? command
पंड्या 13

हां लेकिन इसे एक चर में कैसे लिखें? मैं दो कमांड के बारे में सोचता हूं: PID = pidof <process name>ps -o pid, args | grep $ PID | tr -s "" - cut -d "" -f 2 लेकिन इस तरह से मुझे एक वेरिएबल में args नहीं मिलता है
Michael

जवाबों:


54

आप -oअपने आउटपुट प्रारूप को निर्दिष्ट करने के लिए स्विच का उपयोग कर सकते हैं :

$ ps -eo args

से आदमी पेज :

एक स्ट्रिंग के रूप में अपने सभी तर्कों के साथ कमांड करें। तर्कों में संशोधन दिखाए जा सकते हैं। [...]

आप -pकिसी विशिष्ट PID का चयन करने के लिए स्विच का उपयोग भी कर सकते हैं :

$ ps -p [PID] -o args

pidofप्रक्रिया नाम से PID पर स्विच करने के लिए भी उपयोग किया जा सकता है, इसलिए -pएक नाम के उपयोग की अनुमति देता है :

$ ps -p $(pidof dhcpcd) -o args

बेशक, आप इसके लिए भी उपयोग कर सकते हैं grep(जिस स्थिति में, आपको -eस्विच जोड़ना होगा ):

$ ps -eo args | grep dhcpcd | head -n -1

GNU ps आपको हेडर निकालने की अनुमति देगा (बेशक, यह उपयोग करते समय अनावश्यक है grep):

$ ps -p $(pidof dhcpcd) -o args --no-headers

अन्य प्रणालियों पर, आप AWK या sed में पाइप कर सकते हैं:

$ ps -p $(pidof dhcpcd) -o args | awk 'NR > 1'
$ ps -p $(pidof dhcpcd) -o args | sed 1d

संपादित करें: यदि आप इस लाइन को एक चर में पकड़ना चाहते हैं, तो $(...)हमेशा की तरह उपयोग करें :

$ CMDLINE=$(ps -p $(pidof dhcpcd) -o args --no-headers)

या, के साथ grep:

$ CMDLINE=$(ps -eo args | grep dhcpcd | head -n -1)

@ मिचेल (या ) के argsसाथ बदलें । commandcmd
पंड्या 13

@ पांड्या दोनों cmdऔर commandउपनाम हैं args, यह शायद अनावश्यक है।
जॉन डब्ल्यूएच स्मिथ

मेरे पास बिजीबॉक्स का उपयोग करने वाला एक p विकल्प नहीं है: उपयोग: ps [-o COL1, COL2 = HEADER] [-T]
माइकल

आप उपयोग कर सकते हैं grepलाइन आप वास्तव में रुचि रखते हैं को पकड़ने के लिए: ps -eo args | grep dhcpcd | head -n -1। मैंने अपना उत्तर संपादित किया।
जॉन डब्ल्यूएच स्मिथ

ओह, यह अच्छा लग रहा है: ps -o args | grep <प्रक्रिया नाम> | हेड-एन 1
माइकल

12

कुछ इस तरह की कोशिश करो:

(मेरे राउटर्स में OpenWrt पर बिजीबॉक्स से उदाहरण आउटपुट)

root@ap8:~# xargs -0 printf '%s\n' </proc/991/cmdline
/usr/sbin/uhttpd
-f
-h
/www
-r
ap8
-x
/cgi-bin
-u
/ubus
-t
60
-T
30
-k
20
-A
1
-n
3
-N
100
-R
-p
0.0.0.0:80
-p
[::]:80

/proc/$PID/cmdline$PIDएक के बाद एक सी-ईश तार की तरह प्रक्रिया की दलीलें शामिल हैं । प्रत्येक स्ट्रिंग को शून्य समाप्त किया जाता है।

उद्धरण कुछ तर्क या विकल्प खोल सामान हैं। आपको दिखाई जा रही रेखाओं के करीब देखना होगा और जहाँ शेल के लिए विशेष अर्थ वाले स्थान या अन्य वर्ण उपयोग किए जाते हैं। आपको इन वर्णों को किसी तरह या संपूर्ण तर्क को फिर से इन पंक्तियों को एक कमांड लाइन में शामिल करते समय उद्धृत करने की आवश्यकता होगी।


1
tr "\0" " " </proc/991/cmdline
साइरस

@ साइरस: आप समीपवर्ती अलग-अलग आर्गों से कॉग के रिक्त स्थान को अलग नहीं कर सकते। शून्य बाइट को एक स्थान से बदलकर आप जानकारी को नष्ट कर देते हैं।
यति

1
मैं \0बुरा होने के लिए `` के साथ बदलने के लिए सहमत हूं , लेकिन मुझे लगता tr '\0' '\n' < /proc/$foo/cmdlineहै कि इससे थोड़ा सरल है xargs
पैट्रिक

printfआउटपुट में उद्धरण जोड़ना आसान बनाता है, नई लाइन वगैरह के बजाय एक स्थान डालें। जब अधिक प्रसंस्करण को जोड़ने के बारे में सोच रहे हैं, तो जिस तरह से printfएक अच्छी शुरुआत है।
यति

12

विधि # 1 - पीएस का उपयोग करना

आप उपयोग कर सकते हैं ps -eaf | grep 1234

उदाहरण

$ ps -eaf | grep 28865
saml     28865  9661  0 03:06 pts/2    00:00:00 bash -c sleep 10000; while [ 1 ];do echo hi;sleep 10;done
saml     28866 28865  0 03:06 pts/2    00:00:00 sleep 10000

ध्यान दें: बिजीबॉक्स psमें -eafस्विचेस शामिल नहीं है जैसा कि ऊपर से दिखाया गया है, जो psकि अधिकांश लिनक्स के साथ शामिल है, हालांकि बिजीबॉक्स psशो दिखाता है कि मेरे द्वारा दिए गए उदाहरण के लिए बहुत समान आउटपुट दिखता है। आप अधिकांश लिनक्स पर बिजीबॉक्स स्थापित कर सकते हैं और इसे ऐसे ही चला सकते हैं:

$ busybox ps
  852 root       0:00 /sbin/auditd -n
  855 root       0:01 /sbin/audispd
  857 root       0:00 /usr/sbin/sedispatch
  866 root       0:00 /usr/sbin/alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00main rdaemon
  867 root       0:00 /usr/libexec/bluetooth/bluetoothd
  869 root       0:01 {firewalld} /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
  871 root       0:32 /usr/libexec/accounts-daemon
  873 rtkit      0:05 /usr/libexec/rtkit-daemon
  875 root       0:00 /usr/sbin/ModemManager
  876 avahi      0:03 avahi-daemon: running [dufresne.local]
  878 root       0:54 /usr/sbin/irqbalance --foreground
  884 root       0:00 /usr/sbin/smartd -n -q never
  886 avahi      0:00 avahi-daemon: chroot helper
  891 chrony     0:01 /usr/sbin/chronyd
  892 root       0:01 /usr/lib/systemd/systemd-logind
  893 dbus       1:28 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation

विधि # 2 - उपयोग / खरीद

आप उस cmdlineफ़ाइल को भी देख सकते हैं जो प्रत्येक PID के अंतर्गत है /proc/<pid>

$ cat /proc/28865/cmdline 
bash-csleep 10000; while [ 1 ];do echo hi;sleep 10;done

लेकिन ध्यान दें कि यह रिक्ति को याद कर रहा है। यह इस NUL वर्ण के कारण आपके कमांड लाइन के तर्कों को अलग करने के लिए इस फ़ाइल के भीतर उपयोग किया जा रहा है। हालांकि चिंता की कोई बात नहीं है।

$ tr '\0' ' ' </proc/28865/cmdline
bash -c sleep 10000; while [ 1 ];do echo hi;sleep 10;done

संदर्भ


2

पीआईडी ​​को जानते हुए, बस निष्पादित करें

cat / proc / pid / cmdline

उदाहरण के लिए, पीआईडी ​​= 127 के लिए

# cat /proc/127/cmdline ; echo ""
/usr/lib/jvm/jdk-8-oracle-x64//bin/java-Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager-Djava.library.path=/usr/lib/jni-javaagent:/jmxtrans-agent-1.2.2.jar=/opt/tomcat/conf/jmxtrans-agent.xml-Dcom.sun.management.jmxremote.port=5000-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false-Djava.endorsed.dirs=/opt/tomcat/endorsed-classpath/opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar-Dcatalina.base=/opt/tomcat-Dcatalina.home=/opt/tomcat-Djava.io.tmpdir=/opt/tomcat/temporg.apache.catalina.startup.Bootstrapstart
#
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.