Wie erhalte ich einen Prozess-Exit-Status von einer anderen Shell-Sitzung?

7

Angenommen, ich führe beispielsweise einen Befehl in einer Shell-Sitzung aus bash -c 'apt-get update && apt-get upgrade'. 5 Minuten später entscheide ich mich für einen Snack nach draußen und stelle fest, dass ich vergessen habe, einen Benachrichtigungsmechanismus hinzuzufügen, um festzustellen, ob der Ausgang erfolgreich war oder fehlgeschlagen ist.

Nun, was mache ich jetzt? Wenn ich nur von einem anderen Terminal aus den Exit-Status dieses anderen Befehls (oder speziell dieser PID) abfragen könnte, könnte ich vielleicht doch eine Art Popup anzeigen. Die Frage ist also: Wie kann ich den Exit-Status eines bereits laufenden Prozesses von einem anderen Terminal aus abfragen?

Mit anderen Worten,

GEGEBEN, dass ich einen laufenden Prozess in Terminal A habe UND dessen PID bekannt ist

WENN ich einen Befehl in Terminal B ausführe

DANN sollte ich wissen können, ob der Prozess in Terminal A mit dem Exit-Status 0 oder dem Exit-Status> 1 endet.

Sergiy Kolodyazhnyy
quelle
Sie möchten also, dass etwas (ein Alarmbefehl, der den Exit-Code meldet?) Ausgeführt wird, sobald ein bestimmter, willkürlicher Prozess A (gegebene PID) beendet ist, nachdem ein "Beobachter" mit Befehl B daran angehängt wurde? Wir können nicht davon ausgehen, dass A ein Hintergrundjob ist, der in derselben Shell ausgeführt wird, in der Sie später B eingeben, nein?
Byte Commander
@ ByteCommander Richtig. Es ist ein Vordergrundjob.
Sergiy Kolodyazhnyy
Ich glaube nicht, dass es möglich ist, einen Rückkehrcode von einem Kind einer anderen Shell zu erhalten. Sie können waitden Code eines Hintergrundprozesses in Ihrer aktuellen Shell abrufen, nachdem dieser beendet wurde, aber ich konnte nichts finden, mit dem andere Shells abgefragt werden könnten. Das einfache Überwachen, ob ein Prozess noch ausgeführt wird, und das Auslösen einer Warnung nach dem Beenden ist ebenfalls wieder trivial, ohne jedoch den Beendigungscode herauszufinden. Der einzige Weg, den ich mir PROMPT_COMMANDvorstellen könnte, wäre die Vorbereitung Ihrer Shell , um den letzten Exit-Code in einem Tempfile oder einem ähnlichen zugänglichen Ort zu speichern. Wäre das eine Option?
Byte Commander
@ ByteCommander Nein. Keine Vorbereitung von Terminal A, machen Sie alles von Terminal B. Und vertrauen Sie mir, es ist möglich.
Sergiy Kolodyazhnyy
1
Nun, es wäre eine permanente Vorbereitung (einmaliges Bearbeiten von .bashrc), aber okay. Ich freue mich darauf, die Antwort zu lesen, falls Sie eine finden.
Byte Commander

Antworten:

8

Verwenden Sie stracewie folgt:

sudo strace -e trace=none -e signal=none -q -p $PID

Weder Systemaufrufe noch Signale sind hier von Interesse, daher empfehlen wir strace, sie mit den -eAusdrücken zu ignorieren und eine Statusmeldung mit zu unterdrücken -q. straceWird mit PID an den Prozess angehängt $PID, wartet darauf, dass er normal beendet wird, und gibt seinen Beendigungsstatus wie folgt aus:

+++ exited with 0 +++

Ein einfacher ifAusdruck zum Aufrufen einer beliebigen Art von Benachrichtigung könnte sein:

if sudo strace -e trace=none -e signal=none -q -p $PID |& grep -q ' 0 '; then
  echo yeah
else
  echo nope
fi

Beispiellauf

# in terminal 1
$ (echo $BASHPID;sleep 10;true)
8807
# in terminal 2
$ if sudo strace -e{trace,signal}=none -qp8807|&grep -q ' 0 ';then echo yeah;else echo nope;fi
yeah

# in terminal 1
$ (echo $BASHPID;sleep 10;false)
12285
# in terminal 2
$ if sudo strace -e{trace,signal}=none -qp12285|&grep -q ' 0 ';then echo yeah;else echo nope;fi
nope

Der größte Teil des Kredits geht an diese Antwort bei U & L. Bitte hinterlassen Sie dort eine positive Bewertung, wenn Sie dies nützlich finden.

Dessert
quelle