Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/12/2011, à 10:43

charpy

[Résolu] Trigger (style incron) pour l'arrêt d'un programme

Bonjour,

J'utilise compiz avec emerald, et comme ce dernier a tendance à planter de temps en temps (en me laissant sans décorateur de fenètres), je me suis mis un petit lanceur dans un panel qui exécute : "emerald --replace". Ca me permet de récupérer ce bug assez rapidement en un clic.

Je me suis demandé récemment comment détecter l'arrêt d'emerald pour le relancer automatiquement, sans intervention de ma part. J'ai d'abord pensé à faire un script qui vérifie de temps en temps qu'un process nommé emerald existe (et sinon, il le lance) toutes les x secondes, mais je trouve dommage de devoir laisser un script en background, même s'il consomerait peu de ressources.

Deuxième option, je me demande s'il existe un programme permettant de détecter le démarrage/l'arrêt d'un programme (et de lancer un script), un peu comme incron qui exécute un script lorsqu'il y a une modification dans les fichiers.

Ma question est : connaissez-vous un programme permettant de détecter des évènements liés à des processus, et de lancer des actions en fonction des évènements détectés?

Merci.

Dernière modification par charpy (Le 02/01/2012, à 09:47)

Hors ligne

#2 Le 30/12/2011, à 10:17

charpy

Re : [Résolu] Trigger (style incron) pour l'arrêt d'un programme

Personne?

Hors ligne

#3 Le 30/12/2011, à 11:42

johndo

Re : [Résolu] Trigger (style incron) pour l'arrêt d'un programme

la solution est "presque" dans ton le titre de ta demande : inotifytools
ça ne te permet pas de surveiller les processus mais les fichiers/dossiers. Sachant qu'il existe un dossier par processus dans le dossier /proc, il te suffit de surveiller la suppression du dossier correspondant au processus d'emerald...
Pour la mise en oeuvre, je te laisse te débrouiller...

Dernière modification par johndo (Le 30/12/2011, à 11:42)

Hors ligne

#4 Le 02/01/2012, à 09:46

charpy

Re : [Résolu] Trigger (style incron) pour l'arrêt d'un programme

Génial! Je ne savais pas que les processus avaient un dossier dans /proc.
Merci pour l'astuce, je vais tester ça!

Hors ligne

#5 Le 02/01/2012, à 12:11

charpy

Re : [Résolu] Trigger (style incron) pour l'arrêt d'un programme

En fait inotifytools ne marche pas avec /proc... Je suis tombé sur quelques articles à ce sujet et j'ai l'impression que ce que je veux faire est impossible par ce biais.
J'ai trouvé une solution pour mon problème avec emerald : j'ai créé un fichier exécutable qui exécute emerald en boucle (boucle qui bloque tant que emerald n'a pas planté) et qui est lancé au démarrage de l'ordi.
Dommage de ne pas avoir trouvé comment notifier les "évènements processus".
Merci wink

Hors ligne

#6 Le 02/01/2012, à 17:33

johndo

Re : [Résolu] Trigger (style incron) pour l'arrêt d'un programme

cela ne semble pas fonctionner sur les dossiers des processus...
cependant :

% icedove&
[1] 13579
%  inotifywait -e CLOSE  /proc/13579/exe
Setting up watches.  
Watches established.
/proc/13579/exe CLOSE_NOWRITE,CLOSE 
% 
[1]  + done       icedove

par ailleurs, ça m'est venu un peu tardivement mais pour détecter la fin d'un procesus fils, il y a wait <pid>

Hors ligne

#7 Le 04/01/2012, à 15:01

charpy

Re : [Résolu] Trigger (style incron) pour l'arrêt d'un programme

Excellent! J'ai donc la question à ma réponse. Pour ce que que ça intéresse, j'ai fait un script qui détecte la fin d'un processus ${ProcessToWatch} et lance des commandes ${OnCrashCommand_i} lorsque cela se produit.

#!/bin/bash

#----------------------------------------------------------
#   Parameters
#----------------------------------------------------------

ProcessToWatch='emerald'
OnCrashCommand_1='emerald --replace'
OnCrashCommand_2='/home/charpy/scripts/emerald/emerald-watcher.sh'

#----------------------------------------------------------
#   Test existence
#----------------------------------------------------------

ProcessId=$((`ps -C ${ProcessToWatch} -o pid=`))
if [ $? -ne 0 ];
then
echo 'Error : Process not found !'
exit
fi
echo 'Process id = '${ProcessId}

#----------------------------------------------------------
#   Wait for process crash
#----------------------------------------------------------
# We use inotifywait to watch /proc/${ProcessId}/exe
# The process crashed if executable closes or is not found

inotifywait -e close /proc/${ProcessId}/exe
echo 'CRASHED !'
echo 'Running command : '${OnCrashCommand_1}
${OnCrashCommand_1} &
echo 'Running command : '${OnCrashCommand_2}
${OnCrashCommand_2} &

J'ai mis deux commandes à la fin. La deuxième permet de relancer ce script.

Hors ligne