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 dessen Argumente. Ich benutze Busybox auf SliTaz.
ps
(nicht empfohlen) oder suchen Sie nach einem alternativen Befehlps
, mit dem Sie die Ausgabe erhalten? Was ist zu tun, wennps
mehrere Zeilen ausgegeben werden? Alles / Erstes / Letztes drucken?arg
wiecommand
laut @John Antwort ?pidof <process name>
ps -o pid, args | grep $ PID | tr -s "" | cut -d "" -f 2 Aber auf diese Weise bekomme ich die Args nicht in einer VariablenAntworten:
Sie können den
-o
Schalter verwenden, um Ihr Ausgabeformat anzugeben:Von der Manpage :
Sie können den
-p
Schalter auch verwenden , um eine bestimmte PID auszuwählen:pidof
kann auch verwendet werden, um von Prozessname zu PID zu wechseln, wodurch die Verwendung-p
mit einem Namen ermöglicht wird:Natürlich können Sie auch dafür verwenden
grep
(in diesem Fall müssen Sie den-e
Schalter hinzufügen ):Mit GNU ps können Sie auch die Header entfernen (dies ist natürlich nicht erforderlich, wenn Sie verwenden
grep
):Auf anderen Systemen können Sie an AWK oder sed weiterleiten:
Bearbeiten: Wenn Sie diese Zeile in eine Variable fangen möchten, verwenden Sie einfach
$(...)
wie gewohnt:oder mit
grep
:quelle
args
mitcommand
(odercmd
).cmd
undcommand
sind Aliase dafürargs
, das ist wohl unnötig.grep
die Linie zu fangen Sie wirklich interessiert sind:ps -eo args | grep dhcpcd | head -n -1
. Ich habe meine Antwort bearbeitet.Versuchen Sie so etwas:
(Beispielausgabe von busybox unter OpenWrt auf einem meiner Router)
/proc/$PID/cmdline
enthält die Argumente des Prozesses$PID
wie ein C-String nach dem anderen. Jede Zeichenfolge ist mit Null abgeschlossen.Anführungszeichen um einige Argumente oder Optionen sind Shell-Sachen. Sie müssen sich die angezeigten Zeilen genauer ansehen und herausfinden, wo Leerzeichen oder andere Zeichen mit besonderer Bedeutung für die Shell verwendet werden. Sie müssen diese Zeichen oder das gesamte Argument in Anführungszeichen setzen, wenn Sie diese Zeilen wieder mit einer Befehlszeile verbinden.
quelle
tr "\0" " " </proc/991/cmdline
\0
durch `` zu ersetzen , um schlecht zu sein, aber ich denketr '\0' '\n' < /proc/$foo/cmdline
, ein bisschen einfacher zu sein alsxargs
.printf
Erleichtert das Hinzufügen von Anführungszeichen zur Ausgabe, das Einfügen eines Leerzeichens anstelle der neuen Zeile usw. Wenn Sie daran denken, mehr Verarbeitung hinzuzufügen, ist der Weg darüberprintf
ein guter Anfang.Methode 1 - Verwenden von ps
Du könntest es gebrauchen
ps -eaf | grep 1234
.Beispiel
ANMERKUNG: Busybox
ps
enthält nicht die-eaf
Switches, wie oben gezeigtps
, die in den meisten Linux-Versionen enthalten sind. Busyboxps
zeigt jedoch, welche Ausgabe dem von mir bereitgestellten Beispiel sehr ähnlich zu sein scheint . Sie können Busybox unter den meisten Linux-Betriebssystemen installieren und folgendermaßen ausführen:Methode 2 - Verwenden von / proc
Sie können sich auch die
cmdline
Datei ansehen, unter der sich jede PID befindet/proc/<pid>
.Beachten Sie jedoch, dass der Abstand fehlt. Dies liegt daran, dass in dieser Datei ein NUL-Zeichen verwendet wird, um die Befehlszeilenargumente zu trennen. Keine Sorge, diese können herausgenommen werden.
Verweise
quelle
Wenn Sie die PID kennen, führen Sie einfach aus
Zum Beispiel für PID = 127
quelle