Alerte : "Processus terminé" (Recherche d'un outil) Le sujet est résolu
- dezix
- Membre hyper actif
- Messages : 3548
- Inscription : 04 juin 2016, 14:50
- Status : Hors-ligne
Bonjour,
Je recherche un petit utilitaire capable de surveiller l'exécution d'un processus pex avec le PID comme entrée
et d’exécuter une commande (jouer un son /afficher une notification de Bureau)
lorsque le processus surveillé se termine.
Merci
Je recherche un petit utilitaire capable de surveiller l'exécution d'un processus pex avec le PID comme entrée
et d’exécuter une commande (jouer un son /afficher une notification de Bureau)
lorsque le processus surveillé se termine.
Merci
**Simple Utilisateur** -- Debian stable - XFCE
- lol
- Site Admin
- Messages : 5054
- Inscription : 04 avr. 2016, 12:11
- Localisation : Madagascar
- Status : Hors-ligne
Salut,
Un script qui surveille le pid et envoie une notification avec "notify-send" quand le pid disparait ?
Un script qui surveille le pid et envoie une notification avec "notify-send" quand le pid disparait ?
Code : Tout sélectionner
$ notify-send 'Hey? Toi!!!!' 'Yeah! Programme Python terminé!'
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
- lol
- Site Admin
- Messages : 5054
- Inscription : 04 avr. 2016, 12:11
- Localisation : Madagascar
- Status : Hors-ligne
Salut,
Je parlais de faire un script qui utilise notify-send pour envoyer l'alerte sur le bureau.
notify-send ne fait que ça (envoyer une alerte), mais il le fait bien...
Genre:
/usr/local/bin/script.sh ma-commande
Avec ceci dans le script:
Je parlais de faire un script qui utilise notify-send pour envoyer l'alerte sur le bureau.
notify-send ne fait que ça (envoyer une alerte), mais il le fait bien...

Genre:
/usr/local/bin/script.sh ma-commande
Avec ceci dans le script:
Code : Tout sélectionner
1) Je cherche le pid de la commande
2) Boucle = Le pid existe encore ? Oui > je re-vérifie
3) Le pid n'existe plus ? > J'envoie une alerte (notify-send) et je sors...
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
- dezix
- Membre hyper actif
- Messages : 3548
- Inscription : 04 juin 2016, 14:50
- Status : Hors-ligne
- dezix
- Membre hyper actif
- Messages : 3548
- Inscription : 04 juin 2016, 14:50
- Status : Hors-ligne
Pour la culture générale et la curiosité ....
Et une commande à laquelle on passe un PID et qui en lancerait une autre lorsque ce PID disparaît ?
ça doit bien exister, c'est plus commode que de réinventer la roue à chaque fois ...
Et une commande à laquelle on passe un PID et qui en lancerait une autre lorsque ce PID disparaît ?
ça doit bien exister, c'est plus commode que de réinventer la roue à chaque fois ...

**Simple Utilisateur** -- Debian stable - XFCE
- lol
- Site Admin
- Messages : 5054
- Inscription : 04 avr. 2016, 12:11
- Localisation : Madagascar
- Status : Hors-ligne
Hello,
Il faut que tu donnes plus de détails, il y a mille façon de faire, et il y a mille façon de surveiller un processus.
Par exemple...
J'ouvre HTOP dans un terminal, il a comme pid 24143
C'est très simple de surveiller quand le pid disparait (Avec -t 0 - Tu as aimé!)
A la fermeture de HTOP:
on a cette ligne qui apparait:
Et la notification:
Le script va dépendre de la commande, il faut donc plus de détails.
Il faut que tu donnes plus de détails, il y a mille façon de faire, et il y a mille façon de surveiller un processus.
Par exemple...
J'ouvre HTOP dans un terminal, il a comme pid 24143
Code : Tout sélectionner
$ ps -aux | pgrep -f htop
24143
Code : Tout sélectionner
$ (while kill -0 $(ps -aux | pgrep -f htop); do sleep 1; done) && notify-send -t 0 'Hey? Toi!!!!' 'Attention! HTOP vient de se fermer!'
on a cette ligne qui apparait:
Code : Tout sélectionner
$ (while kill -0 $(ps -aux | pgrep -f htop); do sleep 1; done) && notify-send -t 0 'Hey? Toi!!!!' 'Attention! HTOP vient de se fermer!'
kill : utilisation :kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... ou kill -l [sigspec]
Le script va dépendre de la commande, il faut donc plus de détails.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
- dezix
- Membre hyper actif
- Messages : 3548
- Inscription : 04 juin 2016, 14:50
- Status : Hors-ligne
Thank you Man!
Tu as booster ma curiosité ... Bonne ou mauvaise nouvelle ???
Comme je n'ai pas installé htop,
je teste avec top
et ça tombe bien,
car :
et
à cause de xfdesktop qui "matche" aussi !
mais avec -x (nom exact)
ça le fait :
Il y a des choses que je ne pige pas complètement dans tes commandes
(j'apprends et je critique positivement enfin j'essaye)
1. Pourquoi ce pipe de ps à pgrep ?....... j'ai la sensation d'un doublon
2. Je crois que ps -aux (c'est le manuel qui le dit) est une erreur
Pour voir tous les processus ça serait : ps ax ou ps aux ou ps -e ou ps -A
enfin "ps" c'est le souk aux options ;-))
pgrep -x <nom_exact> me semble un bon plan
(simple et précis si on connaît la commande et c'est le cas)
J'ai donc testé :
$ (while kill -0 $(pgrep -x top); do sleep 5; done) && notify-send -t 0 -i hook-notifier 'Top' 'Terminé!'
ça donne :

Je suis déjà super satisfait!
Mon contexte (celui qui motive ma question) est rsync
pour des sauvegardes de xxx Go
Là ce qui précède ne va pas bien le faire
car j'ai noté qu'une unique commande génère plusieurs processus (4),
mais je pense (non vérifié) qu'ils s'arrêtent tous en même temps....
... ça ouvre la porte aux plans bancales.
Une bonne nouvelle/espoir en lisant le Manuel de KILL (2) :
La mauvaise c'est que je n'ai aucune info sur les groupes de processus
et comment on les identifie pour kill -0
La seule info que j'ai trouvée dans le man de pgrep :
mais ça ne m'avance pas des masses.
... une idée brillante Mon Signor ?


Tu as booster ma curiosité ... Bonne ou mauvaise nouvelle ???
Comme je n'ai pas installé htop,
je teste avec top
et ça tombe bien,
car :
Code : Tout sélectionner
$ ps -aux | pgrep -f top
1323
32416
Code : Tout sélectionner
$ pgrep -f top
1323
32416
mais avec -x (nom exact)
ça le fait :
Code : Tout sélectionner
$ pgrep -x top
32416
Il y a des choses que je ne pige pas complètement dans tes commandes
(j'apprends et je critique positivement enfin j'essaye)
1. Pourquoi ce pipe de ps à pgrep ?....... j'ai la sensation d'un doublon
2. Je crois que ps -aux (c'est le manuel qui le dit) est une erreur
Pour voir tous les processus ça serait : ps ax ou ps aux ou ps -e ou ps -A
enfin "ps" c'est le souk aux options ;-))
pgrep -x <nom_exact> me semble un bon plan
(simple et précis si on connaît la commande et c'est le cas)
J'ai donc testé :
$ (while kill -0 $(pgrep -x top); do sleep 5; done) && notify-send -t 0 -i hook-notifier 'Top' 'Terminé!'
ça donne :

Je suis déjà super satisfait!

Mon contexte (celui qui motive ma question) est rsync
pour des sauvegardes de xxx Go
Là ce qui précède ne va pas bien le faire
car j'ai noté qu'une unique commande génère plusieurs processus (4),
mais je pense (non vérifié) qu'ils s'arrêtent tous en même temps....
... ça ouvre la porte aux plans bancales.
Une bonne nouvelle/espoir en lisant le Manuel de KILL (2) :
Si signal est 0 alors aucun signal n'est envoyé,
mais des contrôles d'existence et de permission sont (encore) effectués ;
cela peut être utilisé pour vérifier l'existence d'un ID de processus
ou d'un ID de groupe de processus que l'appelant est autorisé à signaler.
La mauvaise c'est que je n'ai aucune info sur les groupes de processus
et comment on les identifie pour kill -0
La seule info que j'ai trouvée dans le man de pgrep :
Code : Tout sélectionner
-g, --pgroup pgrp,...
Ne rechercher que des processus dans les groupes de processus
donnés. Le groupe de processus 0 se traduit par le propre groupe
de processus de pgrep ou pkill.
-G, --group gid,...
Ne rechercher que des processus dont l'identifiant de groupe
réel est donné. Les valeurs utilisées peuvent être numériques ou
symboliques.
... une idée brillante Mon Signor ?

**Simple Utilisateur** -- Debian stable - XFCE
- dezix
- Membre hyper actif
- Messages : 3548
- Inscription : 04 juin 2016, 14:50
- Status : Hors-ligne
Je crois avoir trouvé comment travailler non pas avec le PID mais avec le PGID :
en reprenant top comme exemple :
avec :
%p => pid
%r => pgid
%c => commande
Donc pour la surveillance d'un Groupe de Processus,
la dernière commande fournit le PGID
C'est aussi valable pour une commande isolée comme top dans le test.
La question que je me pose à présent :
Comment cela se passe-t-il dans un script ?
Est-ce que le script crée/forme un groupe contenant toutes les commandes qu'il exécute,
ou bien chaque commande crée-t-elle son propre PGID ?
en reprenant top comme exemple :
Code : Tout sélectionner
$ pgrep -x top
42661
$ ps -eo "%p %r" | grep -i $(pgrep -x top)
42661 42661
$ ps -eo "%c %r" | grep -i $(pgrep -x top)
top 42661
$ ps -eo "%r" | grep -i $(pgrep -x top)
42661
%p => pid
%r => pgid
%c => commande
Donc pour la surveillance d'un Groupe de Processus,
la dernière commande fournit le PGID
C'est aussi valable pour une commande isolée comme top dans le test.
La question que je me pose à présent :
Comment cela se passe-t-il dans un script ?
Est-ce que le script crée/forme un groupe contenant toutes les commandes qu'il exécute,
ou bien chaque commande crée-t-elle son propre PGID ?
**Simple Utilisateur** -- Debian stable - XFCE
- dezix
- Membre hyper actif
- Messages : 3548
- Inscription : 04 juin 2016, 14:50
- Status : Hors-ligne
Je me rends compte que :
$ ps -eo "%r"
peut être aussi écrit :
$ ps -eo pgid
ce qui est plus explicite.
et ça donne :
ÉDITÉ: Ce qui suit est FAUX ! ça ne fonctionne que si PID = PGIP
$ (while kill -0 $(ps -eo pgid | grep -i $(pgrep -x top)); do sleep 1; done) && notify-send -t 0 'Top' 'Terminé!'
Il ne reste qu'à tester cela dans un script pour vérifier que ça fonctionne encore....
$ ps -eo "%r"
peut être aussi écrit :
$ ps -eo pgid
ce qui est plus explicite.
et ça donne :
ÉDITÉ: Ce qui suit est FAUX ! ça ne fonctionne que si PID = PGIP
$ (while kill -0 $(ps -eo pgid | grep -i $(pgrep -x top)); do sleep 1; done) && notify-send -t 0 'Top' 'Terminé!'
Il ne reste qu'à tester cela dans un script pour vérifier que ça fonctionne encore....
**Simple Utilisateur** -- Debian stable - XFCE
- lol
- Site Admin
- Messages : 5054
- Inscription : 04 avr. 2016, 12:11
- Localisation : Madagascar
- Status : Hors-ligne
Hello,
Avec les bonnes options pgrep fonctionnera très bien:
Avec les bonnes options pgrep fonctionnera très bien:
Code : Tout sélectionner
$ cat test_notify.sh
#!/bin/bash
rsync -a Make_custom_XYZ.bak/iso/ Make_custom_XYZ/iso/ &
(while kill -0 $(pgrep -n -f rsync); do sleep 5; done) && notify-send -t 0 -i emote-love 'rsync' 'Terminé!'
exit 0
Code : Tout sélectionner
$ ./test_notify.sh
kill : utilisation :kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... ou kill -l [sigspec]
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
-
- Modérateur
- Messages : 896
- Inscription : 16 avr. 2016, 22:14
- Status : Hors-ligne
Bonjour
Pour éviter la boucle while,
j'aurais plutôt fait comme ça :
Pour éviter la boucle while,
j'aurais plutôt fait comme ça :
Code : Tout sélectionner
#!/bin/bash
rsync -a Make_custom_XYZ.bak/iso/ Make_custom_XYZ/iso/ \
&& notify-send -t 0 -i face-smile 'rsync' '<span color="#4f4"><b>Terminé.</b></span>' \
|| notify-send -t 0 -i face-sad 'rsync' '<span color="#f44"><b>Erreur N°$?</b></span>'
-
- Modérateur
- Messages : 896
- Inscription : 16 avr. 2016, 22:14
- Status : Hors-ligne
Sur mon système, il y a 13428 icônes
Pour voir la liste numérotée des icônes possibles sur ta machinePour pouvoir les utiliser avec notify-send
il te faudra supprimer le chemin et le nom d'extension du fichier icône.
Pour voir la liste numérotée des icônes possibles sur ta machine
Code : Tout sélectionner
find /usr/share/icons/** -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /image/) print $1 }' | less -N
il te faudra supprimer le chemin et le nom d'extension du fichier icône.
- dezix
- Membre hyper actif
- Messages : 3548
- Inscription : 04 juin 2016, 14:50
- Status : Hors-ligne
C'est dingo le nombre d'icons sur un système !
27670 sur le mien alors que je n'ai installé que Numix (13642)
le reste étant le mini nécessaire aux applications.
Donc toi tu n'as que le strict minimum.
27670 sur le mien alors que je n'ai installé que Numix (13642)
le reste étant le mini nécessaire aux applications.
Donc toi tu n'as que le strict minimum.
**Simple Utilisateur** -- Debian stable - XFCE
- dezix
- Membre hyper actif
- Messages : 3548
- Inscription : 04 juin 2016, 14:50
- Status : Hors-ligne
Une petite Q? supplémentaire :
Je viens de lire : Exit Codes With Special Meanings
et de faire quelques tests avec diverses valeurs,
exit ou exit $? donne une info sur la dernière commande exécutée dans le script
mais,
Quel est l'avantage de "forcer" la sortie d'erreur du script à 0 ?
Jusqu'à présent, j'ai toujours utilisé : exit (sans argument - par ignorance)
Je viens de lire : Exit Codes With Special Meanings
et de faire quelques tests avec diverses valeurs,
exit ou exit $? donne une info sur la dernière commande exécutée dans le script
mais,
Quel est l'avantage de "forcer" la sortie d'erreur du script à 0 ?
**Simple Utilisateur** -- Debian stable - XFCE
-
- Membre actif
- Messages : 526
- Inscription : 24 août 2016, 19:35
- Localisation : Gnome 43 - debian 12
- Status : Hors-ligne
Bonjour dezix, merci pour l'interrogation, en effet, à première vue cela ne sert à rien ! L'erreur est toujours indiquée quand même.
J'ai fait un essai :
cat Z-script-fin-session-tor
#!/bin/bash
# but : Script défragmentation base de données SQLite navigateur tor
for f in ~/.local/share/applications/tor0/tor-browser_fr/Browser/TorBrowser/Data/Browser/profile.default/*.sqlite; do sqlite3 $f 'VACUUM;'; done
let "var1 = 1/0"
sync
exit 0
user1000@ma-machine:~$ ./Z-script-fin-session-tor
./Z-script-fin-session-tor: ligne 7: let: var1 = 1/0 : division par 0 (le symbole erroné est « 0 »)
Je vais enlever exit 0 de mes scripts ! J'avais suivi bêtement des exemples.
J'ai fait un essai :
cat Z-script-fin-session-tor
#!/bin/bash
# but : Script défragmentation base de données SQLite navigateur tor
for f in ~/.local/share/applications/tor0/tor-browser_fr/Browser/TorBrowser/Data/Browser/profile.default/*.sqlite; do sqlite3 $f 'VACUUM;'; done
let "var1 = 1/0"
sync
exit 0
user1000@ma-machine:~$ ./Z-script-fin-session-tor
./Z-script-fin-session-tor: ligne 7: let: var1 = 1/0 : division par 0 (le symbole erroné est « 0 »)
Je vais enlever exit 0 de mes scripts ! J'avais suivi bêtement des exemples.
Parler de liberté n'a de sens qu'à condition que ce soit la liberté de dire aux gens ce qu'ils n'ont pas envie d'entendre. Eric Blair, George Orwell
- lol
- Site Admin
- Messages : 5054
- Inscription : 04 avr. 2016, 12:11
- Localisation : Madagascar
- Status : Hors-ligne
Salut,
la valeur d'exit permet de savoir si le script c'est bien déroulé ou pas. Si tu n'analyse pas cette valeur de sortie, finalement mettre exit 0/1/2... ne change pas grand chose.
Disons que c'est une habitude pour moi de finir mes scripts. Si je termine sur le exit 0 c'est que l'ensemble du script a bien été exécuté sans interruption.
exit (0) ou EXIT_SUCCESS – Termine le programme normalement, c’est-à-dire qu’il n’y a pas d’erreur dans le programme.
exit (1) ou EXIT_FAILURE – Il indique une terminaison infructueuse.
Tu peux très bien ne rien mettre.dezix a écrit : 13 juin 2020, 11:09Quel est l'avantage de "forcer" la sortie d'erreur du script à 0 ?
la valeur d'exit permet de savoir si le script c'est bien déroulé ou pas. Si tu n'analyse pas cette valeur de sortie, finalement mettre exit 0/1/2... ne change pas grand chose.
Disons que c'est une habitude pour moi de finir mes scripts. Si je termine sur le exit 0 c'est que l'ensemble du script a bien été exécuté sans interruption.
exit (0) ou EXIT_SUCCESS – Termine le programme normalement, c’est-à-dire qu’il n’y a pas d’erreur dans le programme.
exit (1) ou EXIT_FAILURE – Il indique une terminaison infructueuse.
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
- lol
- Site Admin
- Messages : 5054
- Inscription : 04 avr. 2016, 12:11
- Localisation : Madagascar
- Status : Hors-ligne
exit <> 0 n'est pas une indication d'erreur dans un script, mais une indication d'interruption.
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.