Gibt es eine Möglichkeit, den Prozess zu hören?

8

Ich möchte wissen, ob es eine Möglichkeit gibt, einen Prozess unter Linux und Unix anzuhören - wann er endet und wie der Exit-Code des Prozesses (Skript) lautet.

Ich will nicht , ein Skript schreiben , die ausgeführt werden XSekunden und überprüfen , indem Sie, ps -ef | grep PIDob der Prozess noch am Leben ist. Ich möchte wissen, ob es eine Möglichkeit gibt, wie der Prozess mich benachrichtigt, wenn er beendet wurde, und wie der Exit-Code lautete.

Nir
quelle

Antworten:

3

Bash macht das für dich. Es benachrichtigt Sie, wenn der Prozess endet, indem es Ihnen die Kontrolle zurückgibt, und speichert den Exit-Status in der speziellen Variablen $?. Es sieht ungefähr so ​​aus:

someprocess
echo $?

Weitere Informationen finden Sie im Bash-Handbuch zu speziellen Parametern .

Aber ich gehe davon aus, dass Sie während des Wartens andere Arbeiten erledigen möchten. In Bash können Sie das so machen:

someprocess &
otherwork
wait %+
echo $?

someprocess &startet den Vorgang im Hintergrund. Das bedeutet, dass die Kontrolle sofort zurückkehrt und Sie andere Arbeiten ausführen können. Ein im Hintergrund gestarteter Prozess wird als Job in Bash bezeichnet. waitwartet, bis der angegebene Job beendet ist, und gibt dann den Beendigungsstatus dieses Jobs zurück. Jobs werden von referenziert %n. %+bezieht sich auf den zuletzt gestarteten Job. Weitere Informationen finden Sie im Bash-Handbuch zur Jobsteuerung .

Wenn Sie die PID wirklich benötigen, können Sie dies auch folgendermaßen tun:

someprocess &
PID=$!
otherwork
wait $PID
echo $?

$! ist eine spezielle Variable, die die PID des zuletzt gestarteten Hintergrundprozesses enthält.

Lesmana
quelle
Und wie geht waitdas? Wie viel CPU wird normalerweise vom System benötigt?
Nir
1
Ich weiß nicht, wie genau Bash waitfunktioniert. Ich weiß, dass es keine nennenswerte Menge an Systemressourcen erfordert. Sie können den Quellcode hier überprüfen
lesmana
6

Ein - zugegebenermaßen hartnäckiger - Ansatz besteht darin, Folgendes zu verwenden strace:

$ strace -e trace=none -e signal=none -p 12345

überwacht den Prozess mit der PID 12345 und fängt keinen Systemaufruf (erster -e) und keine Signale (zweiter -e) ab. Sobald der Prozess regelmäßig beendet wird, wird der Exit-Wert gedruckt.

Wenn der Prozess durch ein Signal beendet wird, wird strace lautlos beendet (wenn es mit den oben angegebenen Optionen ausgeführt wird). Sie können zB verwenden -e signal=kill, um dieses Verhalten zu ändern. Beachten Sie jedoch, dass -e signal=all(oder gleichwertig das Weglassen der -e signalOption) eine große Menge an Ausgabe erzeugen kann, wenn Signale vom Programm empfangen und verarbeitet werden.

Ansgar Esztermann
quelle
4
  1. Verkettung der Ausführung von "benachrichtigen"

    $ process; notify $? &

    Beachten Sie, dass wenn der Prozess auf unerwartete Weise beendet notifywird, er nicht ausgeführt wird

  2. Fallen aufstellen

    Der Prozess wird durch Signale unterschiedlicher Bedeutung signalisiert und kann entsprechend reagieren

    #!/bin/bash
    
    process
    
    function finish {
        notify $?
    }
    trap finish EXIT
    

Sie sind sich nicht sicher, welche Benachrichtigung Sie im Sinn haben. Im Wesentlichen kann es natürlich alles sein, was eine "Glocke" läutet. Eins für viele zB. notify-sendaus der libnotifyBibliothek.

$ process; notify-send "process finished with status $?" &
Miroslav Koškár
quelle
2

Wenn Ihr Prozess als Deamon ausgeführt wird, sollten Sie Upstart oder Monit verwenden. Dies sind Standardmethoden:

http://www.alexreisner.com/code/upstart

http://mmonit.com/monit/

Sie können Prozesse überwachen, Code beenden, Prozesse neu starten, Protokolle schreiben, ...

Damphat
quelle
1

Mit können ptrace()Sie einen Tracer an einen Prozess anhängen (oder einen neuen ausführen), einen Hook mit PTRACE_O_TRACEEXIT(linux> = 2.5.60) setzen und bis zum Beenden des Prozesses schlafen und dann PTRACE_GETEVENTMSGden Exit-Status abrufen .

Hier eine Beispielimplementierung namens Stopper , ich habe sie nur mit der attachOption überprüft und es waren einige Änderungen erforderlich, damit sie funktioniert (eventuell werde ich den Code bei Bedarf irgendwo veröffentlichen).

Alex
quelle