Es gibt mehr Infos /proc/<pid>unter Linux, schauen Sie einfach mal rein.
Bei anderen Unixen können die Dinge anders sein. Der psBefehl funktioniert überall, das /procZeug ist betriebssystemspezifisch. Zum Beispiel gibt es unter AIX kein cmdlineIn /proc.
Unter Linux benötigen Sie wahrscheinlich -ww (dh ps -ww -fp <pid>), um eine breite Ausgabe anzugeben, da diese bei mehreren Befehlen möglicherweise abgeschnitten werden.
cat /proc/<pid>/cmdlineFunktioniert auch in Cygwin, wo cmd-Zeilenargumente psmit keiner Option angezeigt werden.
Lechup
3
Wenn Sie unter Linux nur das benötigen, argslautet der Befehl ps -o args -p <pid>und es wird nur das argsoder -o gedruckt, cmdwenn Sie nur das sehen müssen cmd. Der Versuch zu lesen /proc/<pid>/cmdlinefunktioniert nicht immer für Benutzer ohne Berechtigung. Das psDienstprogramm wird funktionieren.
Alvits
2
Hinweis: Die Länge von /proc/<pid>/cmdlineist begrenzt (fest auf den Wert des Kernelparameters PAGE_SIZE codiert), sodass längere Befehlszeilen immer noch abgeschnitten angezeigt werden! Weitere Informationen finden Sie unter stackoverflow.com/questions/199130/… . Sie können Ihre Kernel-Einstellung mit abfragen getconf PAGE_SIZE, es ist normalerweise 4096.
t0r0X
61
Dies wird den Trick tun:
xargs -0 < /proc/<pid>/cmdline
Ohne die xargs gibt es keine Leerzeichen zwischen den Argumenten, da sie in NULs konvertiert wurden.
Leerzeichen werden nicht entfernt, sondern durch NULs ersetzt.
Bdonlan
@bdonlan Ah, das habe ich nicht überprüft. Guter Fang!
Lothar
4
xargs -0 echo </ proc / <pid> / cmdline. Sie können dies auch mit / proc / <pid> / environ tun, obwohl Sie dafür möglicherweise -n 1 hinzufügen möchten.
Camh
Auf meinem System gibt es kein / proc-Dateisystem :( irgendeine andere Lösung?
Hemant
Meins ist ein Java-Prozess mit langen, langen, langen Parametern. Es schneidet meine Ausgabe immer noch ab. Irgendwelche Ratschläge?
Johnsam
14
Sie können verwenden pgrepmit -f(vollständige Befehlszeile) und -l(lange Beschreibung):
pgrep -l -f PatternOfProcess
Diese Methode unterscheidet sich entscheidend von allen anderen Antworten: Sie funktioniert unter CygWin , sodass Sie damit die vollständige Befehlszeile aller unter Windows ausgeführten Prozesse abrufen können (als erhöht ausführen, wenn Sie Daten zu einem erhöhten / Administrator-Prozess wünschen). . Jede andere Methode, um dies unter Windows zu tun, ist ( zum Beispiel ) umständlicher .
Außerdem: In meinen Tests war der pgrep-Weg das einzige System, das den vollständigen Pfad für Skripte erhalten hat, die in CygWins Python ausgeführt werden .
Zu Ihrer Information , Sie können auch cat -v / proc / PID / cmdline | verwenden sed 's / \ ^ @ / \ n / g' . Dadurch wird das Nullzeichen durch ein Zeilenumbruchzeichen ersetzt. Dabei wird jedes Argument in einer eigenen Zeile gedruckt. Auf diese Weise ist es einfacher, ein Argument von einem anderen zu unterscheiden.
Zusätzlich zu allen oben genannten Möglichkeiten zum Konvertieren des Textes wird die Ausgabe standardmäßig in separaten Zeilen ausgeführt, wenn Sie einfach "Zeichenfolgen" verwenden. Mit dem zusätzlichen Vorteil, dass möglicherweise auch keine Zeichen angezeigt werden, die Ihr Terminal verschlüsseln könnten.
Beide geben in einem Befehl aus:
Zeichenfolgen / proc // cmdline / proc // environ
Die eigentliche Frage ist ... gibt es eine Möglichkeit, die tatsächliche Befehlszeile eines Prozesses unter Linux anzuzeigen, der so geändert wurde, dass die cmdline den geänderten Text anstelle des tatsächlich ausgeführten Befehls enthält.
Wenn Sie eine möglichst lange Zeit erhalten möchten (nicht sicher, welche Grenzen es gibt), ähnlich wie bei Solaris ' Pargs , können Sie diese unter Linux und OSX verwenden:
tr \\0 ' ' < /proc/<pid>/cmdline
Antworten:
Es gibt mehrere Möglichkeiten:
Es gibt mehr Infos
/proc/<pid>
unter Linux, schauen Sie einfach mal rein.Bei anderen Unixen können die Dinge anders sein. Der
ps
Befehl funktioniert überall, das/proc
Zeug ist betriebssystemspezifisch. Zum Beispiel gibt es unter AIX keincmdline
In/proc
.quelle
ps -ww -fp <pid>
), um eine breite Ausgabe anzugeben, da diese bei mehreren Befehlen möglicherweise abgeschnitten werden.-ww
Option ermöglicht den Zugriff auf vollständige Befehlszeilenargumente (so viel wie vom Kernel gespeichert wird). Siehe auch: Wie Solaris und BSD die nicht abgeschnittenen Befehlszeilenparameter für einen Prozess und ps-Optionen erhaltencat /proc/<pid>/cmdline
Funktioniert auch in Cygwin, wo cmd-Zeilenargumenteps
mit keiner Option angezeigt werden.args
lautet der Befehlps -o args -p <pid>
und es wird nur dasargs
oder -o gedruckt,cmd
wenn Sie nur das sehen müssencmd
. Der Versuch zu lesen/proc/<pid>/cmdline
funktioniert nicht immer für Benutzer ohne Berechtigung. Dasps
Dienstprogramm wird funktionieren./proc/<pid>/cmdline
ist begrenzt (fest auf den Wert des Kernelparameters PAGE_SIZE codiert), sodass längere Befehlszeilen immer noch abgeschnitten angezeigt werden! Weitere Informationen finden Sie unter stackoverflow.com/questions/199130/… . Sie können Ihre Kernel-Einstellung mit abfragengetconf PAGE_SIZE
, es ist normalerweise 4096.Dies wird den Trick tun:
Ohne die xargs gibt es keine Leerzeichen zwischen den Argumenten, da sie in NULs konvertiert wurden.
quelle
xargs -0 < /proc/<pid>/cmdline
.Vollständige Befehlszeile
Für Linux & Unix System können Sie
ps -ef | grep process_name
die vollständige Befehlszeile abrufen.Wenn Sie auf SunOS-Systemen die vollständige Befehlszeile erhalten möchten, können Sie diese verwenden
Um die vollständige Befehlszeile zu erhalten, müssen Sie Superuser werden.
Liste der Argumente
gibt eine detaillierte Liste der an einen Prozess übergebenen Argumente. Das Array von Argumenten wird folgendermaßen ausgegeben:
Ich habe keinen ähnlichen Befehl für Linux gefunden, aber ich würde den folgenden Befehl verwenden, um eine ähnliche Ausgabe zu erhalten:
quelle
Unter Linux
Sie erhalten die Befehlszeile des Prozesses (einschließlich Argumente), wobei jedoch alle Leerzeichen in NUL-Zeichen geändert wurden.
quelle
Sie können verwenden
pgrep
mit-f
(vollständige Befehlszeile) und-l
(lange Beschreibung):Diese Methode unterscheidet sich entscheidend von allen anderen Antworten: Sie funktioniert unter CygWin , sodass Sie damit die vollständige Befehlszeile aller unter Windows ausgeführten Prozesse abrufen können (als erhöht ausführen, wenn Sie Daten zu einem erhöhten / Administrator-Prozess wünschen). . Jede andere Methode, um dies unter Windows zu tun, ist ( zum Beispiel ) umständlicher .
Außerdem: In meinen Tests war der pgrep-Weg das einzige System, das den vollständigen Pfad für Skripte erhalten hat, die in CygWins Python ausgeführt werden .
quelle
$ 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
und3.3.12
. Druckt einfach den PID- und Prorgam-Namen ohne Argumente.Eine andere Variante des Druckens
/proc/PID/cmdline
mit Leerzeichen unter Linux ist:Auf diese Weise werden NULL-Zeichen
cat
gedruckt als^@
und anschließend durch ein Leerzeichen ersetztsed
.echo
druckt eine neue Zeile.quelle
Sie können einfach verwenden:
quelle
Anstatt mehrere Befehle zum Bearbeiten des Streams zu verwenden, verwenden Sie einfach einen - tr übersetzt ein Zeichen in ein anderes:
quelle
Zusätzlich zu allen oben genannten Möglichkeiten zum Konvertieren des Textes wird die Ausgabe standardmäßig in separaten Zeilen ausgeführt, wenn Sie einfach "Zeichenfolgen" verwenden. Mit dem zusätzlichen Vorteil, dass möglicherweise auch keine Zeichen angezeigt werden, die Ihr Terminal verschlüsseln könnten.
Beide geben in einem Befehl aus:
Zeichenfolgen / proc // cmdline / proc // environ
Die eigentliche Frage ist ... gibt es eine Möglichkeit, die tatsächliche Befehlszeile eines Prozesses unter Linux anzuzeigen, der so geändert wurde, dass die cmdline den geänderten Text anstelle des tatsächlich ausgeführten Befehls enthält.
quelle
Unter Solaris
Ähnliches kann auf Unix-ähnlichen Systemen verwendet werden.
quelle
Unter Linux mit Bash als zitierte Argumente ausgeben, damit Sie den Befehl bearbeiten und erneut ausführen können
Unter Solaris mit bash (getestet mit 3.2.51 (1) -release) und ohne gnu userland:
Linux Bash Beispiel (Einfügen in Terminal):
Ausgabe:
Solaris Bash Beispiel:
Ausgabe:
quelle
Wenn Sie eine möglichst lange Zeit erhalten möchten (nicht sicher, welche Grenzen es gibt), ähnlich wie bei Solaris ' Pargs , können Sie diese unter Linux und OSX verwenden:
quelle
Versuchen
ps -n
in einem Linux-Terminal. Dies wird zeigen:1.Alle Prozesse RUNNING , ihre Befehlszeile und ihre PIDs
Danach wissen Sie, welchen Prozess Sie beenden müssen
quelle