Befehl, mit dem ein Prozess ausgeführt wurde

8

Angenommen, ich habe den Prozess mit dem folgenden Befehl ausgeführt:

myapp -e -c -f myapp.config > /var/log/myapp/myapp.log 2>&1

Nach einer Weile habe ich nur pidvon myappVerfahren, zB 1234. Gibt es eine Möglichkeit , den Befehl mit allen Flaggen und Umleitung Ausgang zu erreichen , myapp.logindem irgendwie gerade pid?

user3663882
quelle

Antworten:

10
ps -o args= -p "$pid"

Hier erfahren Sie, welche Argumentliste für den letzten Befehl angegeben wurde, den der Prozess ausgeführt hat (oder, falls er keinen ausgeführt hat, den, den sein übergeordneter Befehl ausgeführt hat ...), sofern der Prozess seine Argumentliste danach nicht überschrieben hat.

pszeigt an, dass die Arg-Liste mit Leerzeichen verkettet ist und bis zu einem Grenzwert, den Sie möglicherweise bei einigen psImplementierungen durch Hinzufügen einiger -wOptionen erhöhen können. Unter Linux sehen Sie die durch NUL-Bytes getrennte Arglist in /proc/$pid/cmdline.

lsof +fg -ap "$pid" -d 0-2

Hier erfahren Sie, auf was die Dateideskriptoren stdin, stdout und stderr des Prozesses verweisen und in welchem ​​Modus sie geöffnet wurden (wie W,APbeim Nur-Schreiben mit Anhängen, als ob eine >>Umleitung in einer POSIX-Shell verwendet würde).

Stéphane Chazelas
quelle
+1 für die Verwendung lsof, um zu erkennen, dass der Prozess inmyapp.log
joeytwiddle
1
Eine andere Möglichkeit, die Ausgabedatei zu finden, ist:readlink /proc/$pid/fd/1
joeytwiddle
Aaah, ich hatte gedacht, das OP bedeutet Prozessflags, kein Ausdruck des Befehls und seiner Optionen! Gute Antwort.
Arronical
4

Sie können den psBefehl verwenden und die PID angeben, die mit dem -pSchalter untersucht werden soll. Verwenden Sie den -fSchalter, um eine vollständige Auflistung oder -leine detailliertere lange Auflistung zu erhalten.

Als Beispiel für die Ausgabe:

$ sleep 60 &
[1] 31441
$ ps -lp 31441
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0 31441 31319  0  80   0 -  1423 hrtime pts/3    00:00:00 sleep
$ ps -fp 31441
UID        PID  PPID  C STIME TTY          TIME CMD
root     31441 31319  0 10:44 pts/3    00:00:00 sleep 60

Dies gibt jedoch eine Kopfzeile aus, die Sie möglicherweise nicht in Ihrer Protokolldatei haben möchten. Sie können dies mithilfe der -hOption kürzen, wenn Ihre PID 1234 war:

ps -lhp 1234 >> /var/log/myapp/myapp.log 2>&1

Beachten Sie, dass ich die Ausgabe umgeleitet habe >>, um sie an Ihre Protokolldatei anzuhängen.

Arronisch
quelle
Um die Kopfzeile zu entfernen tail -n+1(erfordert GNU, aber Q war Linux / Ubuntu). Oder vermeiden Sie das Problem mit ps -h{f,l}p 1234(auch GNU).
Dave_thompson_085
@ dave_thompson_085 danke, ich wusste, dass es eine Option zum Entfernen des Headers gibt, aber ich habe nicht weit genug in der Manpage gescrollt. tail -n1funktioniert definitiv unter Ubuntu, warum ist das +nötig?
Arronical
Ich denke, Dave wollte vorschlagen, tail -n+2welche alle Zeilen außer der ersten zeigt. tail -n1zeigt nur die letzte Zeile. Vergleichen Sie: seq 1 10 | tail -n+2und so weiter.
Joeytwiddle
1
@joeytwiddle ah jetzt sehe ich, ich habe bearbeitet, um seinen Rat aufzunehmen, -hda es eine unnötige Pipe und zusätzlichen Prozess vermeidet.
Arronical
1

Mit ps -fkönnen Sie die Argumentliste überprüfen und sie auch in eine beliebige Datei umleiten.

Also, in diesem Fall einfach verwenden ps -ef | grep 1234 > myapp.log

Bitte überprüfen Sie diese ps Manpage .

Harshit
quelle
1
Gibt dies nicht auch die Details des Befehls grep aus?
Arronical
2
@Arronical Ja, du hast recht. Sie können dies vermeiden, indem Sie den Befehl grep ausschließen:ps -ef | grep 'foo' | grep -v grep
maulinglawns
@maulinglawns Das hätte ich getan, wenn ich den Grep-Weg gegangen wäre. Das hat auch den Vorteil, dass der Header entfernt wird.
Arronical
Um das zu vermeiden, grep -vbenutze ich diesen Trick:grep '123[4]'
joeytwiddle