Alert po zakończeniu procesu


21

Jest tu kilka pytań i odpowiedzi dotyczących powiadamiania o zakończeniu / zakończeniu procesu ( 1 , 2 ) - ale wszystkie zakładają, że użytkownik sam wydał wspomniany proces, a zatem mogą go skrypty za pomocą alertu wbudowanego w skrypt zarządzający lub potokuj proces do jakiegoś rodzaju alertu.

Moja sytuacja polega na tym, że chcę zostać powiadomiony o zakończeniu / zakończeniu procesu, którego mój użytkownik nie inicjuje. Mianowicie przetwarzam masowo pliki wideo na serwerze Ubuntu 12.04 LTS. Niektóre operacje na tych plikach zajmują bardzo dużo czasu, dlatego chciałbym jakiś alert (e-mail byłby świetny) po zakończeniu określonego. Trwają tak długo, że zrobienie tego jednorazowo, ręcznie, w oparciu o PIT, byłoby całkowicie w porządku.

Aby dostarczyć więcej informacji - załóżmy, że przetwarzam szczególnie duży plik, i widzę, że przeszedł on do skryptu FFMPEG, sam proces jest skryptem w języku Python (który jest dość złożony i nie jest napisany przeze mnie, i coś takiego Nie chcę modyfikować - choć byłoby to pierwsze logiczne podejście). Wyobrażam sobie wydanie polecenia lub skryptu z PID wspomnianego uruchomionego skryptu python jako argumentu, a kiedy proces z tym PID nie jest już uruchomiony, skrypt alertu robi swoje.

Jakieś pomysły?


monit ( mmonit.com/monit/documentation ) wydaje się potencjalną opcją, ale o wiele bardziej złożoną niż to, czego potrzebuję - mając nadzieję, że może istnieć prostszy, bardziej bezpośredni i mniej rozdęty sposób robienia tylko tego, o co proszę, i nie więcej .
klucz

Odpowiedzi:


9

Napisałem process_watcher.py

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

Obecnie treść wiadomości e-mail wygląda następująco:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Rozpoczęty: czw, 10 marca 18:33:37 Zakończony: czw, 10 marca 18:34:26 (czas trwania 0 : 00: 49)
Pamięć (bieżąca / szczytowa) - rezydent: 155.280 / 155.304 kB Wirtualny: 1.166.968 / 1.118.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

Rozwiąż problem GitHub, jeśli potrzebujesz ulepszeń.


23

Coś takiego?

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

Zamień $pidna identyfikator procesu i echo "finished"cokolwiek chcesz zrobić po zakończeniu procesu.

Na przykład:

(while kill -0 $pid; do sleep 1; done) && mail ...

Fenomenalny! Działa jak marzenie.
klucz

1
Drobna (i prawdopodobnie oczywista) uwaga - gdy wspomniany proces nie jest własnością użytkownika, musi zabić sudo.
klucz

1
@dongle, przynajmniej na moim polu RHEL, kill -0raporty No such processo nieistniejących pidach i Operation not permittedpidach należących do innego użytkownika, więc być może interpretacja komunikatu o błędzie powinna wyeliminować potrzebęsudo
iruvar

1
Jeśli echo, zawsze możesz echo -en "\007 \007 \007", co wyda terminalowy „dzwonek”. To, czy przekłada się to na rzeczywisty słyszalny dźwięk, zależy od terminala i sprzętu (ale zazwyczaj tak jest).
Morgon,

5

Używam &&do wykonania drugiego polecenia, gdy pierwsze jest pomyślnie zakończone. Oto kilka przykładów:

  1. Usuń duży folder i wyemituj sygnał dźwiękowy:

    rm -rv ~/tmp && beep
  2. Skompiluj jądro i wyślij wiadomość e-mail:

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

Czy to dobry sposób na rozwiązanie twojego problemu? W innym przypadku możesz dodać ||i trzecie polecenie w przypadku awarii.

Ponadto skrypt powłoki może otrzymać status wyjścia ( $?) polecenia, a za pomocą if/elsei pętli możesz robić, co chcesz.


Dzięki Willian, ale, jak powiedziałem, szczególnym wyzwaniem w moim przypadku użycia jest to, że nie jest to polecenie, które wydaje, ale już uruchomiony proces. Zatem && nie wchodzi w grę. W każdym razie dzięki.
klucz

4

Jeśli nie masz pid, będzie on działał do momentu zakończenia wszystkich instancji ffmpeg:

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

0

Jeśli nie chcesz korzystać z opcji odpytywania ani zewnętrznego skryptu, a już rozpocząłeś długo działający proces, możesz go zawiesić za pomocą CTRL + Z (wysyła sygnał SIGTSTP), a następnie wznowić za pomocą fg(przenosi proces do pierwszy plan).

Na przykład:

my_command  # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'

Z wyjątkiem ... „Moja sytuacja polega na tym, że chciałbym zostać powiadomiony o zakończeniu / zakończeniu procesu, którego mój użytkownik nie inicjuje.”
Jeff Schaller

-1

Zrobiłem aplikację, która wyśle ​​powiadomienie na Twój telefon z Androidem, gdy proces się zakończy, więc nie musisz być przywiązany do komputera.

Zainstaluj, a następnie dodaj ;notifier.shna końcu polecenia.

Na przykład, jeśli twoje polecenie było make install, wydasz polecenie:

make install; notifier.sh

https://notifier.sh

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


„… Ale wszystkie te zakładają, że użytkownik sam wydał wspomniany proces, a zatem może wykonać skrypt za pomocą alertu wbudowanego w skrypt zarządzający lub przesłać proces do jakiegoś alertu. / Moja sytuacja polega na tym, że chcę zostać powiadomiony o zakończeniu / zakończeniu procesu, którego mój użytkownik nie inicjuje. ”
G-Man mówi„ Przywróć Monikę ”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.