Alerte lorsque le processus en cours se termine

21

Il y a quelques questions et réponses ici concernant l'alerte lorsqu'un processus se termine / se termine ( 1 , 2 ) - mais ceux-ci supposent tous que l'utilisateur a émis ledit processus lui-même, et peut donc l'écrire avec une alerte intégrée dans le régir le script ou diriger le processus vers une sorte d'alerte.

Ma situation est que je voudrais être alerté de l'achèvement / sortie d'un processus que mon utilisateur n'initialise pas. À savoir, je traite en masse des fichiers vidéo massifs sur un serveur Ubuntu 12.04 LTS. Certaines opérations sur ces fichiers prennent très longtemps, donc je voudrais une sorte d'alerte (e-mail serait génial) quand un spécifique se termine. Ils prennent tellement de temps, que faire cela sur une base ponctuelle, manuellement, basée sur PIT serait parfaitement bien.

Pour fournir plus d'informations - disons que je traite un fichier particulièrement volumineux, et je vois qu'il a progressé vers un script FFMPEG, le processus lui-même étant un script python (qui est assez complexe, et non écrit par moi-même, et quelque chose Je ne souhaite pas modifier - bien que ce soit la première approche logique). J'imagine émettre une commande ou un script avec le PID dudit script python en cours d'exécution comme argument, et lorsque le processus avec ce PID n'est plus en cours d'exécution, le script d'alerte fait son travail.

Des idées?

dongle
la source
monit ( mmonit.com/monit/documentation ) semble être une option potentielle, mais beaucoup plus complexe que ce dont j'ai besoin - en espérant qu'il puisse y avoir une façon plus simple, plus directe et moins gonflée de faire uniquement ce que je demande, et pas plus .
dongle

Réponses:

9

J'ai écrit process_watcher.py

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

Actuellement, le corps de l'e-mail ressemble à ceci:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Début: jeu 10 mars 18:33:37 Fin: jeu 10 mars 18:34:26 (durée 0 : 00: 49)
Mémoire (courant / crête) - Résident: 155,280 / 155,304 kB Virtuel: 1,169,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

Créez un problème GitHub si vous avez besoin de l'améliorer.

Arlo
la source
23

Quelque chose comme ça?

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

Remplacez $pidpar l'ID de processus et echo "finished"par tout ce que vous voulez faire à la fin du processus.

Par exemple:

(while kill -0 $pid; do sleep 1; done) && mail ...
le chaos
la source
Phénoménal! Fonctionne comme un charme.
dongle
1
Note mineure (et probablement évidente) - lorsque ledit processus n'appartient pas à l'utilisateur, il doit arrêter le kill.
dongle
1
@dongle, au moins sur ma boîte RHEL, kill -0signale No such processles pids inexistants et les Operation not permittedpids appartenant à un autre utilisateur, donc peut-être que l'interprétation du message d'erreur devrait éviter la nécessité desudo
iruvar
1
Si vous faites écho, vous pourriez toujours echo -en "\007 \007 \007", ce qui émettra une «cloche» de terminal. Que cela se traduise par un son réellement audible dépend de votre terminal et de votre matériel (mais généralement).
Morgon
5

J'utilise &&pour exécuter une deuxième commande lorsque la première est terminée avec succès. Voici quelques exemples:

  1. Supprimez un gros dossier et un bip:

    rm -rv ~/tmp && beep
  2. Compilez un noyau et envoyez un email:

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

Est-ce un bon moyen de résoudre votre problème? Dans un autre cas, vous pouvez ajouter une ||et une troisième commande en cas d'échec.

De plus, un script shell peut recevoir l' état de sortie ( $?) de votre commande, et avec if/elseet boucles vous pouvez faire ce que vous voulez.

Willian Paixao
la source
Merci Willian, mais comme je l'ai dit, le défi particulier dans mon cas d'utilisation est que ce n'est pas une commande que j'émets, mais un processus déjà en cours d'exécution. Ainsi && n'est pas une option. Merci quand même.
dongle
4

Si vous n'avez pas le pid, cela s'exécutera jusqu'à ce que toutes les instances de ffmpeg soient terminées:

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

Si vous ne souhaitez pas utiliser une option d'interrogation ou un script externe et que vous avez déjà démarré le processus de longue durée, vous pouvez le suspendre avec CTRL + Z (envoie un signal SIGTSTP), puis le reprendre avec fg(déplace le processus vers au premier plan).

Par exemple:

my_command  # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'
Benjoin
la source
Sauf ... "Ma situation est que je voudrais être alerté de l'achèvement / sortie d'un processus que mon utilisateur
Jeff Schaller
-1

J'ai créé une application qui enverra une notification à votre téléphone Android à la fin d'un processus afin que vous n'ayez pas à être connecté à votre ordinateur.

Installez, puis ajoutez ;notifier.shà la fin de votre commande.

Par exemple, si votre commande était make install, vous feriez votre commande:

make install; notifier.sh

https://notifier.sh

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

Jolt151
la source
«… Mais ceux-ci supposent tous que l'utilisateur a émis ledit processus lui-même, et peuvent donc l'écrire avec une alerte intégrée au script directeur, ou diriger le processus vers une sorte d'alerte. / Ma situation est que je voudrais être alerté de l'achèvement / sortie d'un processus que mon utilisateur n'initialise pas. »
G-Man dit« Réinstalle Monica »le