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

Demande d'aide : c'est ici.
Répondre
Avatar du membre
dezix
Modérateur
Modérateur
Messages : 930
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

09 juin 2020, 11:15

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
Debian testing/stable - XFCE
Avatar du membre
lol
Site Admin
Site Admin
Messages : 3302
Enregistré le : 04 avr. 2016, 12:11
Localisation : Madagascar
Contact :
Status : Hors ligne

11 juin 2020, 10:45

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 n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Debian stable. XFCE.
C'est curieux chez les marins ce besoin de faire des phrases (Les tontons flingueurs).
Avatar du membre
dezix
Modérateur
Modérateur
Messages : 930
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

11 juin 2020, 10:51

Salut,

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

C'est pour : $ ma_commande && notify-send 'Terminé !'
Debian testing/stable - XFCE
Avatar du membre
lol
Site Admin
Site Admin
Messages : 3302
Enregistré le : 04 avr. 2016, 12:11
Localisation : Madagascar
Contact :
Status : Hors ligne

11 juin 2020, 11:07

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...
Debian stable. XFCE.
C'est curieux chez les marins ce besoin de faire des phrases (Les tontons flingueurs).
Avatar du membre
dezix
Modérateur
Modérateur
Messages : 930
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

11 juin 2020, 11:13

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:
Debian testing/stable - XFCE
Avatar du membre
dezix
Modérateur
Modérateur
Messages : 930
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

11 juin 2020, 11:30

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:
Debian testing/stable - XFCE
Avatar du membre
lol
Site Admin
Site Admin
Messages : 3302
Enregistré le : 04 avr. 2016, 12:11
Localisation : Madagascar
Contact :
Status : Hors ligne

11 juin 2020, 17:20

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 n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Debian stable. XFCE.
C'est curieux chez les marins ce besoin de faire des phrases (Les tontons flingueurs).
Avatar du membre
dezix
Modérateur
Modérateur
Messages : 930
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

11 juin 2020, 20:40

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:
Debian testing/stable - XFCE
Avatar du membre
dezix
Modérateur
Modérateur
Messages : 930
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

11 juin 2020, 23:50

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 ?
Debian testing/stable - XFCE
Avatar du membre
dezix
Modérateur
Modérateur
Messages : 930
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

12 juin 2020, 00:25

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....
Debian testing/stable - XFCE
Avatar du membre
lol
Site Admin
Site Admin
Messages : 3302
Enregistré le : 04 avr. 2016, 12:11
Localisation : Madagascar
Contact :
Status : Hors ligne

12 juin 2020, 08:45

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 n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Debian stable. XFCE.
C'est curieux chez les marins ce besoin de faire des phrases (Les tontons flingueurs).
Avatar du membre
dezix
Modérateur
Modérateur
Messages : 930
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

12 juin 2020, 09:53

FANTASTIK!

Merci .... :good:
Debian testing/stable - XFCE
MicP
Modérateur
Modérateur
Messages : 593
Enregistré le : 16 avr. 2016, 22:14
Status : Hors ligne

12 juin 2020, 10:37

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 du membre
dezix
Modérateur
Modérateur
Messages : 930
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

12 juin 2020, 11:08

@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!
Debian testing/stable - XFCE
MicP
Modérateur
Modérateur
Messages : 593
Enregistré le : 16 avr. 2016, 22:14
Status : Hors ligne

13 juin 2020, 00:44

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 du membre
dezix
Modérateur
Modérateur
Messages : 930
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

13 juin 2020, 09:38

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.
Debian testing/stable - XFCE
Avatar du membre
dezix
Modérateur
Modérateur
Messages : 930
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

13 juin 2020, 11:09

Une petite Q? supplémentaire :
lol a écrit :
12 juin 2020, 08:45
exit 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 ?
Debian testing/stable - XFCE
--gilles--
Membre
Membre
Messages : 490
Enregistré le : 24 août 2016, 19:35
Localisation : Gnome 3.36 - debian 11 bullseye
Status : Hors ligne

13 juin 2020, 11:52

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 du membre
lol
Site Admin
Site Admin
Messages : 3302
Enregistré le : 04 avr. 2016, 12:11
Localisation : Madagascar
Contact :
Status : Hors ligne

13 juin 2020, 11:55

Salut,
dezix a écrit :
13 juin 2020, 11:09
Quel 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.
Debian stable. XFCE.
C'est curieux chez les marins ce besoin de faire des phrases (Les tontons flingueurs).
Avatar du membre
lol
Site Admin
Site Admin
Messages : 3302
Enregistré le : 04 avr. 2016, 12:11
Localisation : Madagascar
Contact :
Status : Hors ligne

13 juin 2020, 11:59

exit <> 0 n'est pas une indication d'erreur dans un script, mais une indication d'interruption.
Debian stable. XFCE.
C'est curieux chez les marins ce besoin de faire des phrases (Les tontons flingueurs).
Répondre