Ich habe eine lang laufende bash
Instanz (innerhalb einer screen
Sitzung), die einen komplexen Satz von Befehlen innerhalb einer Schleife ausführt (wobei jede Schleife Pipes, Weiterleitungen usw. ausführt).
Die lange Befehlszeile wurde im Terminal geschrieben - sie befindet sich nicht in einem Skript. Jetzt kenne ich die Bash-Prozess-ID und habe Root-Zugriff. Wie kann ich sehen, wie genau die Befehlszeile darin ausgeführt wird bash
?
bash$ echo $$
1234
bash$ while true ; do \
someThing | somethingElse 2>/foo/bar | \
yetAnother ; sleep 600 ; done
Und in einer anderen Shell-Instanz möchte ich die Befehlszeile sehen, die in PID 1234 ausgeführt wird:
bash$ echo $$
5678
bash$ su -
sh# cd /proc/1234
sh# # Do something here that will display the string \
'while true ; do someThing | somethingElse 2>/foo/bar | \
yetAnother ; sleep 600 ; done'
Ist das möglich?
EDIT # 1
Hinzufügen von Gegenbeispielen für einige Antworten, die ich habe.
Über die Verwendung des
cmdline
Under/proc/PID
: Das funktioniert nicht, zumindest nicht in meinem Szenario. Hier ist ein einfaches Beispiel:$ echo $$ 8909 $ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
In einer anderen Shell:
$ cat /proc/8909/cmdline bash
Verwenden
ps -p PID --noheaders -o cmd
ist genauso nutzlos:$ ps -p 8909 --no-headers -o cmd bash
ps -eaf
ist auch nicht hilfreich:$ ps -eaf | grep 8909 ttsiod 8909 8905 0 10:09 pts/0 00:00:00 bash ttsiod 30697 8909 0 10:22 pts/0 00:00:00 sleep 30 ttsiod 31292 13928 0 10:23 pts/12 00:00:00 grep --color=auto 8909
Das heißt, es gibt keine Ausgabe der ORIGINAL - Befehlszeile, nach der ich suche - dh nach der
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
.
gdb
:print (char *)rl_line_buffer
. Der aktuelle Befehl in einer Sequenz lautetprint (char *)the_printed_command
. Sie können auchcall history_builtin()
, aber das wird auf die tty des Bash-Prozesses ausgegeben, so dass es möglicherweise weniger nützlich ist.Da der Befehl immer noch auf dem Bildschirm ausgeführt wird, hat die übergeordnete Bash keinen Verlauf erneut gelesen.
^Z
dannup arrow
^A^A
- weil Bildschirm (1) - und^E
) und Echo + Umleitung in eine Dateifg
Befehlsausführung zu verfolgenEs gibt Vorbehalte, aber dies ist die meiste Zeit nützlich genug.
quelle
up
. Sie müssen sich zwar sicher sein, dass es ohne Probleme wieder gestartet wird, aber wenn dies nicht der Fall ist, haben Sie nach einem Neustart trotzdem das gleiche Problem. Sie müssen nur den Moment auswählen, in dem Ausfallzeiten kein Problem darstellen.Ich weiß, dass Sie Ihre eigene Antwort gefunden haben, aber gibt es einen Grund, warum Sie so etwas nicht tun können:
Möglicherweise können Sie die Ausgabe des aktuellen Jobs und die Ausgabe der Bash, die die aktuell ausgeführte Zeile zeigt, nicht miteinander mischen.
Auch FWIW, wenn Sie es vorziehen Ausführlichkeit
set -o xtrace
.quelle