Alerte : "Processus terminé" (Recherche d'un outil) Le sujet est résolu

Demande d'aide : c'est ici.
Répondre
Avatar de l’utilisateur
dezix
Membre hyper actif
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
**Simple Utilisateur** -- Debian stable - XFCE
Avatar de l’utilisateur
lol
Site Admin
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 ?

Code : Tout sélectionner

$ notify-send 'Hey? Toi!!!!' 'Yeah!  Programme Python terminé!'
Capture_2020-06-11_11-43-44.png
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.
Avatar de l’utilisateur
dezix
Membre hyper actif
Membre hyper actif
Messages : 3548
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

Salut,

Tu l'utilises comment? je ne vois pas de PID en argument dans man

C'est pour : $ ma_commande && notify-send 'Terminé !'
**Simple Utilisateur** -- Debian stable - XFCE
Avatar de l’utilisateur
lol
Site Admin
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... :wink:

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.
Avatar de l’utilisateur
dezix
Membre hyper actif
Membre hyper actif
Messages : 3548
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

OK! et merci .... J'achète ! :good:

C'est bien cool,
$ notify-send 'Ma commande' 'Terminé!' -t 0 -i Thunar
donne :
Image


avec -t 0 la notification reste affichée jusqu'à ce que l'on clique dessus => Nickel !

@+

:006:
**Simple Utilisateur** -- Debian stable - XFCE
Avatar de l’utilisateur
dezix
Membre hyper actif
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 ... :017:
**Simple Utilisateur** -- Debian stable - XFCE
Avatar de l’utilisateur
lol
Site Admin
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

Code : Tout sélectionner

$ ps -aux | pgrep -f htop
24143
C'est très simple de surveiller quand le pid disparait (Avec -t 0 - Tu as aimé!)

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!'
A la fermeture de HTOP:
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]
Et la notification:
Capture_2020-06-11_18-12-53.png

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.
Avatar de l’utilisateur
dezix
Membre hyper actif
Membre hyper actif
Messages : 3548
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

Thank you Man! :good:

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
et

Code : Tout sélectionner

$ pgrep -f top
1323
32416
à cause de xfdesktop qui "matche" aussi !

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 :
Image

Je suis déjà super satisfait! :yahoo:


lol a écrit : 11 juin 2020, 17:20 Il faut que tu donnes plus de détails,


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.
   
mais ça ne m'avance pas des masses.


... une idée brillante Mon Signor ?

:dirol:
**Simple Utilisateur** -- Debian stable - XFCE
Avatar de l’utilisateur
dezix
Membre hyper actif
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 :

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
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 ?
**Simple Utilisateur** -- Debian stable - XFCE
Avatar de l’utilisateur
dezix
Membre hyper actif
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....
**Simple Utilisateur** -- Debian stable - XFCE
Avatar de l’utilisateur
lol
Site Admin
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:

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]
Capture_2020-06-12_09-39-33.png
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.
Avatar de l’utilisateur
dezix
Membre hyper actif
Membre hyper actif
Messages : 3548
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

FANTASTIK!

Merci .... :good:
**Simple Utilisateur** -- Debian stable - XFCE
MicP
Modérateur
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 :

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>'
Avatar de l’utilisateur
dezix
Membre hyper actif
Membre hyper actif
Messages : 3548
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

@MicP :good:

J'ai bien fait de poster cette question,
vous me montrez un tas de petits trucs qui vont étoffer ma caisse à outils.

MERCI!
**Simple Utilisateur** -- Debian stable - XFCE
MicP
Modérateur
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 machine

Code : Tout sélectionner

find /usr/share/icons/** -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /image/) print $1 }' | less -N
Pour pouvoir les utiliser avec notify-send
il te faudra supprimer le chemin et le nom d'extension du fichier icône.
Avatar de l’utilisateur
dezix
Membre hyper actif
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.
**Simple Utilisateur** -- Debian stable - XFCE
Avatar de l’utilisateur
dezix
Membre hyper actif
Membre hyper actif
Messages : 3548
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

Une petite Q? supplémentaire :
lol a écrit : 12 juin 2020, 08:45exit 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
--gilles--
Membre actif
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.
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
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 5054
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Salut,
dezix a écrit : 13 juin 2020, 11:09Quel est l'avantage de "forcer" la sortie d'erreur du script à 0 ?
Tu peux très bien ne rien mettre.
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.
Avatar de l’utilisateur
lol
Site Admin
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.
Répondre