Avviso al termine del processo in esecuzione


21

Ci sono alcune domande e risposte qui riguardo all'allerta quando un processo termina / esce ( 1 , 2 ) - ma tutti presumono che l'utente abbia emesso il processo stesso, e quindi possono copiarlo con un avviso incorporato nel script di governo o reindirizza il processo a una sorta di avviso.

La mia situazione è che vorrei essere avvisato del completamento / uscita di un processo che il mio utente non sta inizializzando. Vale a dire, sto elaborando in blocco file video di grandi dimensioni su un server Ubuntu 12.04 LTS. Alcune operazioni su questi file richiedono molto tempo, quindi vorrei un tipo di avviso (la posta elettronica sarebbe ottima) al termine di uno specifico. Richiedono così tanto tempo, che farlo su base una tantum, manualmente, in base al PIT andrebbe benissimo.

Per fornire maggiori informazioni, supponiamo che stia elaborando un file particolarmente grande e vedo che è passato a uno script FFMPEG, il processo stesso è uno script Python (che è piuttosto complesso e non scritto da me stesso, e qualcosa Non desidero modificare, anche se sarebbe il primo approccio logico). Immagino di emettere un comando o uno script con il PID di detto script python in esecuzione come argomento, e quando il processo con quel PID non è più in esecuzione, lo script di avviso fa la sua cosa.

Qualche idea?


monit ( mmonit.com/monit/documentation ) sembra una potenziale opzione, ma molto più complessa di quello di cui ho bisogno - sperando che ci possa essere un modo più semplice, più diretto e meno gonfio di fare solo quello che sto chiedendo, e non di più .
Dongle

Risposte:


9

Ho scritto process_watcher.py

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

Attualmente, il corpo dell'email appare come:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Iniziato: gio 10 mar 18:33:37 Terminato: gio 10 mar 18:34:26 (durata 0 : 00: 49)
Memoria (corrente / picco) - Residente: 155.280 / 155.304 kB Virtuale: 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

Crea un problema con GitHub se hai bisogno di miglioramenti.


23

Qualcosa come questo?

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

Sostituisci $pidcon l'id processo e echo "finished"con qualsiasi cosa tu voglia fare quando il processo è terminato.

Per esempio:

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

Fenomenale! Funziona come un fascino.
Dongle

1
Nota minore (e probabilmente ovvia) - quando detto processo non è di proprietà dell'utente, deve eliminare l'uccisione.
Dongle

1
@dongle, almeno sulla mia casella RHEL, kill -0riporta No such processper pid inesistenti e Operation not permittedper pid di proprietà di un altro utente, quindi forse interpretare il messaggio di errore dovrebbe ovviare alla necessità disudo
iruvar

1
Se stai facendo eco, potresti sempre echo -en "\007 \007 \007", che emetterà una "campana" terminale. Il fatto che ciò si traduca in un vero suono udibile dipende dal terminale e dall'hardware (ma in genere lo fa).
Morgon,

5

Uso &&per eseguire un secondo comando al termine del primo. Ecco alcuni esempi:

  1. Elimina una cartella grande e bip:

    rm -rv ~/tmp && beep
  2. Compilare un kernel e inviare un'e-mail:

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

È un buon modo per risolvere il tuo problema? In un altro caso, è possibile aggiungere un ||terzo comando in caso di errore.

Inoltre, uno script di shell potrebbe ricevere lo stato di uscita ( $?) del tuo comando e con if/elsee loop puoi fare quello che vuoi.


Grazie Willian, ma come ho detto, la sfida particolare nel mio caso d'uso è che questo non è un comando che sto eseguendo, ma un processo già in esecuzione. Quindi && non è un'opzione. Grazie comunque.
Dongle

4

Se non hai il pid, questo verrà eseguito fino a quando tutte le istanze di ffmpeg sono terminate:

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

0

Se non si desidera utilizzare un'opzione di polling o uno script esterno e si è già avviato il processo di lunga durata, è possibile sospenderlo con CTRL + Z (invia il segnale SIGTSTP) e quindi riprenderlo con fg(sposta il processo in il primo piano).

Per esempio:

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

Tranne ... "La mia situazione è che vorrei essere avvisato del completamento / uscita di un processo che il mio utente non sta inizializzando."
Jeff Schaller

-1

Ho creato un'app che invierà una notifica al tuo telefono Android quando termina un processo in modo da non dover essere vincolato al tuo computer.

Installa, quindi aggiungi ;notifier.shalla fine del tuo comando.

Ad esempio, se il tuo comando fosse make install, dovresti eseguire il comando:

make install; notifier.sh

https://notifier.sh

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


"... ma tutti presumono che l'utente abbia emesso il suddetto processo da solo, e quindi può copiarlo con un avviso incorporato nello script di governo o reindirizzare il processo a un qualche tipo di avviso. / La mia situazione è che vorrei essere avvisato del completamento / uscita di un processo che il mio utente non sta inizializzando. ”
G-Man dice 'Reinstate Monica' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.