Warnung, wenn der laufende Prozess beendet ist

21

Es gibt hier ein paar Fragen und Antworten, um benachrichtigt zu werden, wenn ein Prozess abgeschlossen ist / beendet wird ( 1 , 2 ) - diese setzen jedoch alle voraus, dass der Benutzer den Prozess selbst ausgegeben hat, und können ihn daher mit einem in die eingebauten Alert skripten regeln Skript oder leiten Sie den Prozess zu einer Art Warnung.

Meine Situation ist, dass ich über den Abschluss / das Beenden eines Prozesses informiert werden möchte, den mein Benutzer nicht initialisiert. Ich verarbeite gerade massive Videodateien auf einem Ubuntu 12.04 LTS-Server. Bestimmte Vorgänge mit diesen Dateien dauern sehr lange, daher hätte ich gerne eine Warnung (E-Mail wäre toll), wenn eine bestimmte abgeschlossen ist. Sie dauern so lange, dass es völlig in Ordnung wäre, dies einmalig manuell auf der Basis von PIT durchzuführen.

Weitere Informationen: Angenommen, ich bearbeite eine besonders große Datei und sehe, dass sie zu einem FFMPEG-Skript weiterentwickelt wurde. Dabei handelt es sich um ein Python-Skript (das recht komplex und nicht von mir selbst geschrieben ist) Ich möchte nicht ändern - obwohl dies der erste logische Ansatz wäre). Ich stelle mir vor, Sie geben einen Befehl oder ein Skript mit der PID des laufenden Python-Skripts als Argument aus, und wenn der Prozess mit dieser PID nicht mehr ausgeführt wird, macht das Warnskript seine Sache.

Irgendwelche Ideen?

Dongle
quelle
monit ( mmonit.com/monit/documentation ) scheint eine potenzielle Option zu sein, ist aber viel komplexer als ich es benötige - in der Hoffnung, dass es eine einfachere, direktere und weniger aufgeblähte Möglichkeit gibt, nur das zu tun, was ich verlange, und nicht mehr .
Dongle

Antworten:

9

Ich habe process_watcher.py geschrieben

process_watcher --pid 1234 --to me@gmail.com

Derzeit sieht der E-Mail-Text folgendermaßen aus:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Beginn: Do, 10. März 18:33:37 Ende: Do, 10. März 18:34:26 (Dauer 0 : 00: 49)
Speicher (aktuell / Spitzenwert) - Einwohner: 155.280 / 155.304 kB Virtuell: 1.166.968 / 1.188.216 kB

[+] indicates the argument may be specified multiple times, for example:
 process-watcher -p 1234 -p 4258 -c myapp -c "exec\d+" --to person1@domain.com --to person2@someplace.com

optional arguments:
  -h, --help            show this help message and exit
  -p PID, --pid PID     process ID(s) to watch [+]
  -c COMMAND_PATTERN, --command COMMAND_PATTERN
                        watch all processes matching the command name. (RegEx pattern) [+]
  -w, --watch-new       watch for new processes that match --command. (run forever)
  --to EMAIL_ADDRESS    email address to send to [+]
  -n, --notify          send DBUS Desktop notification
  -i SECONDS, --interval SECONDS
                        how often to check on processes. (default: 15.0 seconds)
  -q, --quiet           don't print anything to stdout

Erstellen Sie ein GitHub-Problem, wenn Sie Verbesserungen benötigen.

Arlo
quelle
23

Etwas wie das?

(while kill -0 $pid; do sleep 1; done) && echo "finished"

Ersetzen Sie diese $piddurch die Prozess-ID und das, echo "finished"was Sie tun möchten, wenn der Prozess beendet wird.

Beispielsweise:

(while kill -0 $pid; do sleep 1; done) && mail ...
Chaos
quelle
Phänomenal! Klappt wunderbar.
Dongle
1
Kleiner (und wahrscheinlich offensichtlicher) Hinweis: Wenn der Prozess nicht im Besitz des Benutzers ist, muss sudo den Kill ausführen.
Dongle
1
@dongle, zumindest auf meinem RHEL Feld kill -0Berichte No such processfür inexistent pids und Operation not permittedfür pids von einem anderen Benutzer gehören , so vielleicht die Fehlermeldung zu interpretieren sollte die Notwendigkeit vermeiden fürsudo
Iruvar
1
Wenn du hallst, könntest du immer echo -en "\007 \007 \007", was ein Endgerät "klingeln" wird. Ob dies zu einem tatsächlich hörbaren Klang führt, hängt von Ihrem Terminal und Ihrer Hardware ab (in der Regel jedoch).
Morgon
5

Ich verwende &&, um einen zweiten Befehl auszuführen, wenn der erste erfolgreich abgeschlossen ist. Hier einige Beispiele:

  1. Löschen Sie einen großen Ordner und piepen Sie:

    rm -rv ~/tmp && beep
  2. Kompiliere einen Kernel und sende eine E-Mail:

    make && mail -s "Compilation is done" user@yourmaildomain.com

Ist dies ein guter Weg, um Ihr Problem zu lösen? In einem anderen Fall können Sie im Fehlerfall einen ||und einen dritten Befehl hinzufügen .

Ein Shell-Skript könnte auch den Exit-Status ( $?) Ihres Befehls erhalten und mit if/elseund Schleifen können Sie tun, was Sie wollen.

Willian Paixao
quelle
Vielen Dank an Willian, aber wie gesagt, die besondere Herausforderung in meinem Anwendungsfall ist, dass dies kein Befehl ist, den ich absetze, sondern ein bereits laufender Prozess. Somit ist && keine Option. Danke trotzdem.
Dongle
4

Wenn Sie die PID nicht haben, wird dies ausgeführt, bis alle Instanzen von ffmpeg abgeschlossen sind:

(while pidof ffmpeg | grep -q "[0-9]?"; do sleep 1; done) && echo "finished"
user82927
quelle
0

Wenn Sie keine Abfrageoption oder kein externes Skript verwenden möchten und den lang andauernden Prozess bereits gestartet haben, können Sie ihn mit STRG + Z anhalten (SIGTSTP-Signal senden) und anschließend mit fortsetzen fg(Prozess nach verschieben) der Vordergrund).

Beispielsweise:

my_command  # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'
Benjamin
quelle
Außer ... "Meine Situation ist, dass ich über den Abschluss / das Beenden eines Prozesses informiert werden möchte, den mein Benutzer nicht initialisiert."
Jeff Schaller
-1

Ich habe eine App erstellt, die eine Benachrichtigung an Ihr Android-Handy sendet, wenn ein Vorgang endet, sodass Sie nicht an Ihren Computer gebunden sein müssen.

Installieren Sie und fügen Sie dann ;notifier.sham Ende Ihres Befehls hinzu.

Wenn Ihr Befehl beispielsweise war make install, würden Sie Ihren Befehl ausführen:

make install; notifier.sh

https://notifier.sh

https://play.google.com/store/apps/details?id=sh.notifier

Jolt151
quelle
„… Aber diese setzen alle voraus, dass der Benutzer den Prozess selbst ausgegeben hat und ihn daher mit einer in das übergeordnete Skript integrierten Warnung skripten oder den Prozess an eine Art Warnung weiterleiten kann. / Meine Situation ist, dass ich über den Abschluss / das Beenden eines Prozesses informiert werden möchte, den mein Benutzer nicht initialisiert. ”
G-Man sagt, dass Monica