it-swarm.com.de

Wie erhalte ich die gesamte Befehlszeile eines Prozesses?

Wie kann ich die Befehlsargumente oder die gesamte Befehlszeile von einem laufenden Prozess unter Verwendung seines Prozessnamens abrufen?

Zum Beispiel dieser Prozess:

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

Und was ich will ist /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid oder die Argumente. Ich kenne den Prozessnamen und möchte seine Argumente. Ich benutze Busybox auf SliTaz.

58
Michael

Mit dem Schalter -o Können Sie Ihr Ausgabeformat angeben:

$ ps -eo args

Von die Manpage :

Befehl mit all seinen Argumenten als Zeichenfolge. Änderungen an den Argumenten können angezeigt werden. [...]

Sie können auch den Schalter -p Verwenden, um eine bestimmte PID auszuwählen:

$ ps -p [PID] -o args

pidof kann auch verwendet werden, um vom Prozessnamen zur PID zu wechseln, wodurch die Verwendung von -p mit einem Namen ermöglicht wird:

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

Natürlich können Sie hierfür auch grep verwenden (in diesem Fall müssen Sie den Schalter -e Hinzufügen):

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

Mit GNU ps können Sie auch die Header entfernen (dies ist natürlich bei Verwendung von grep nicht erforderlich):

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

Auf anderen Systemen können Sie zu AWK oder sed leiten:

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

Bearbeiten: Wenn Sie diese Zeile in eine Variable einfangen möchten, verwenden Sie einfach $(...) wie gewohnt:

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

oder mit grep:

$ CMDLINE=$(ps -eo args | grep dhcpcd | head -n -1)
70
John WH Smith

Methode 1 - Verwenden von ps

Sie könnten ps -eaf | grep 1234 Verwenden.

Beispiel

$ 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

HINWEIS: Busyboxs ps enthält nicht die -eaf - Schalter, wie oben gezeigt, von einem typischen ps, das in den meisten Linux-Versionen enthalten ist, jedoch zeigt Busybox ps, was dem von mir bereitgestellten Beispiel sehr ähnlich zu sein scheint. Sie können Busybox auf den meisten Linux-Systemen installieren und wie folgt ausführen:

$ 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

Methode 2 - Verwenden von/proc

Sie können sich auch die Datei cmdline ansehen, die jede PID unter /proc/<pid> Hat.

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

Beachten Sie jedoch, dass der Abstand fehlt. Dies liegt daran, dass in dieser Datei ein NUL-Zeichen verwendet wird, um Ihre Befehlszeilenargumente zu trennen. Keine Sorge, diese können entfernt werden.

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

Verweise

15
slm

Versuchen Sie so etwas:

(Beispielausgabe von Busybox auf OpenWrt auf einem meiner Router)

[email protected]:~# 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 enthält die Argumente des Prozesses $PID wie eine C-ish Zeichenfolge nacheinander. Jede Zeichenfolge ist mit Null abgeschlossen.

Zitate um einige Argumente oder Optionen sind Shell-Sachen. Sie müssen sich die angezeigten Linien genauer ansehen und sehen, wo Leerzeichen oder andere Zeichen mit besonderer Bedeutung für die Shell verwendet werden. Sie müssen diese Zeichen irgendwie oder das vollständige Argument zitieren, wenn Sie diese Zeilen wieder mit einer Befehlszeile verbinden.

13
user62916

Wenn Sie die PID kennen, führen Sie einfach

cat/proc/pid/cmdline

Zum Beispiel für PID = 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
#
5
jmlotero

Wenn Sie kurze Befehle mögen und pgrep verfügbar ist, würde ich pgrep -fl <process_name> Vorschlagen.

ps -o args Wird abgeschnitten

0
Mickael Cagnion

Leichte Version des Befehls ps (BusyBox):

PROCNAME="udhcpc"   
CMD=$(ps | grep $PROCNAME | grep -v grep | head -n 1 | grep -o '/.*$')

Vollversion des Befehls ps:

PROCNAME="udhcpc"
CMD=$(ps -f --no-headers -C $PROCNAME | head -n 1 | grep -o '/.*$')

Oder eine Kombination aus beiden. Da ps in BusyBox kein Argument zum Bestimmen der Version hat (es wird ein Exit-Fehler übergeben), können wir dies ausnutzen:

PROCNAME="udhcpc"
if ps --version; then
    CMD=$(ps -f --no-headers -C $PROCNAME | head -n 1 | grep -o '/.*$')     # full-featured "ps" command
else
    CMD=$(ps | grep $PROCNAME | grep -v grep | head -n 1 | grep -o '/.*$')  # "ps" command from BusyBox
fi

Wenn Sie nur Argumente nach dem Prozessnamen benötigen, teilen Sie die Zeichenfolge nach dem ersten Leerzeichen wie folgt auf:

echo $CMD | cut -d ' ' -f 2-99
0
s3n0