2 Stimmen

Wie kann ich benachrichtigt werden, wenn ein Skript im Hintergrund ausgeführt wird?

Meine Frage ist sehr ähnlich wie die folgende eine mit der Ausnahme, dass mein Hintergrundprozess von einem Skript gestartet wurde. Ich könnte etwas falsch machen, aber wenn ich dieses einfache Beispiel versuche:

#!/bin/bash
set -mb  # enable job control and notification
sleep 5  &

Ich erhalte nie eine Benachrichtigung, wenn der Befehl zum Einschlafen im Hintergrund beendet ist. Wenn ich jedoch denselben Befehl direkt im Terminal ausführe, erhalte ich keine Benachrichtigung,

$ set -mb  
$ sleep 5  &
$
[1]+  Done                    sleep 5

Ich sehe die Ausgabe, die ich erwarte.

Ich verwende bash auf cygwin. Ich vermute, dass es etwas damit zu tun haben könnte, wohin die Ausgabe gerichtet ist, aber versuchen verschiedene Ausgabeumleitung, ich bin nicht näher.

EDITAR: Ich habe also mehr Informationen über das Warum (danke an jkramer), suche aber immer noch nach dem Wie. Wie bekomme ich eine "Push"-Benachrichtigung, dass ein von einem Skript gestarteter Hintergrundprozess beendet wurde? Eine PID in einer Datei zu speichern und abzufragen ist nicht das, wonach ich suche.

2voto

Umae Punkte 405

Wenn Sie es als Quelldatei ausführen, dann kann es benachrichtigen. z.B.

cat foo.sh

#!/bin/bash
set -mb  # enable job control and notification
sleep 5  &

. foo.sh
[1]+  Done                    sleep 5

0voto

jkramer Punkte 15030

Die Job-Kontrolle Ihrer Shell wirkt sich nur auf Prozesse aus, die von Ihrem Terminal kontrolliert werden, d.h. Aufgaben, die direkt von der Shell aus gestartet werden.

Wenn der übergeordnete Prozess (Ihr Skript) stirbt, wird der init-Prozess automatisch zum übergeordneten Prozess des untergeordneten Prozesses (Ihr sleep-Befehl), wodurch alle Ausgaben gelöscht werden. Versuchen Sie dieses Beispiel:

[jkramer/sgi5k:~]# cat foo.sh
#!/bin/bash

sleep 20 &
echo $!
[jkramer/sgi5k:~]# bash foo.sh 
19638
[jkramer/sgi5k:~]# ps -ef | grep 19638
jkramer  19638     1  0 23:08 pts/3    00:00:00 sleep 20
jkramer  19643 19500  0 23:08 pts/3    00:00:00 grep 19638

Wie Sie sehen können, ist der übergeordnete Prozess von sleep nach Beendigung des Skripts 1, der init-Prozess. Wenn Sie über die Beendigung Ihres Kindprozesses benachrichtigt werden wollen, können Sie den Inhalt der Variable $! (PID des zuletzt erstellten Prozesses) in einer Datei oder irgendwo speichern und den Befehl `wait' verwenden, um auf dessen Beendigung zu warten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X