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 26/06/2013, à 13:31

Arbiel

Lancer un script à l'occurence d'un événement

Bonjour à tous

Je voudrais pouvoir lancer un script lorsqu'un utilisateur supprime un lanceur présent sur son bureau, ou d'une manière plus générale, recevoir l'information que l'utilisateur a demandé la suppression d'un lanceur et agir en conséquence.

Le lanceur en question est créé par une procédure que j'ai écrite, et qui créé également d'autres répertoires et fichiers qu'il s'agit de supprimer. Je maîtrise parfaitement les paramètres de ce lanceur.

Eventuellement, je peux interdire la suppression directe du lanceur (si cela est possible par le biais des droits d'accès), et créer sur le bureau un lanceur permettant de supprimer le lanceur en question et tous les répertoires et fichiers qui lui sont logiquement liés, en y glissant le lanceur à supprimer. Cependant, je ne veux pas que ces actions nécessitent la saisie du mot de passe utilisateur (ne pas passer par sudo).

Merci d'avance à qui voudra bien m'indiquer comment je peux résoudre ce problème, si possible en bash car je ne connais pas d'autre langage.

Arbiel

Dernière modification par Arbiel (Le 27/06/2013, à 09:10)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#2 Le 27/06/2013, à 13:18

rquennec

Re : Lancer un script à l'occurence d'un événement

Bonjour,

Tu peux utiliser incron et inotify.

Incron fonctionne de la même manière que cron sauf qu'il permet de déclencher des actions en fonction des évènements du système de fichiers.

Très pratique pour surveiller des fichiers et lancer des actions en fonction (création, ouverture, modification, suppression)

Ronan

Dernière modification par rquennec (Le 27/06/2013, à 13:19)


Proxmox pve-manager/3.4-11/6502936f (running kernel: 2.6.32-40-pve)
Debian 7.9
Ubuntu 10.04.4 LTS / 12.04.5 LTS / 14.04.3 LTS
CentOS release 5.11 (Final)

Hors ligne

#3 Le 27/06/2013, à 14:53

Arbiel

Re : Lancer un script à l'occurence d'un événement

Bonjour

Je te remercie, car cela incron semble effectivement correspondre à ce que je cherche. Je viens de l'installer. Il ne me reste plus qu'à apprendre à l'utiliser.

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#4 Le 27/06/2013, à 21:50

rquennec

Re : Lancer un script à l'occurence d'un événement

Bonsoir,

La commande n'est pas très compliquée.

incrontab -e permet de créer une règle incron.
incrontab -l permet de lister les règles créées.

pour utiliser incrontab, il faut indiquer le user autorisé à l'utiliser dans le fichier /etc/incron.allow

il faut indiquer au minimum 3 paramètres qui sont :
1 - le répertoire ou le fichier à surveiller
2 - le ou les évènements effectués sur le fichier/dossier à surveiller
3 - la commande ou le script à exécuter

les évènements étant (man 5 incrontab):
       IN_ACCESS           File was accessed (read) (*)
       IN_ATTRIB           Metadata changed (permissions, timestamps, extended
       attributes, etc.) (*)
       IN_CLOSE_WRITE      File opened for writing was closed (*)
       IN_CLOSE_NOWRITE    File not opened for writing was closed (*)
       IN_CREATE           File/directory created in watched directory (*)
       IN_DELETE           File/directory deleted from watched directory (*)
       IN_DELETE_SELF           Watched file/directory was itself deleted
       IN_MODIFY           File was modified (*)
       IN_MOVE_SELF        Watched file/directory was itself moved
       IN_MOVED_FROM       File moved out of watched directory (*)
       IN_MOVED_TO         File moved into watched directory (*)
       IN_OPEN             File was opened (*)
      
il y a également des caractères génériques qui permettent de transmettre des infos au script à exécuter :
       $$   signe dollar
       $@   nom du fichier/dossier surveillé
       $#   évènement effectué sur le fichier/dossier

le plus dur à bien paramétrer est l'évènement, mais pour cela il existe la commande inotifywait qui permet d'afficher tous les évènements en cours d'exécution sur un fichier/dossier.

pour l'exemple, je vais surveiller le dossier /tmp et voir ce qu'il se passe quand je créé, modifie et supprime un fichier :
# cd /tmp
# inotifywait -m ./
dans une autre console,, je crée un fichier test dans le dossier /tmp
# touch /tmp/test

la commande inotifywait affiche :
./ OPEN,ISDIR
./ CLOSE_NOWRITE,CLOSE,ISDIR
./ CREATE test
./ OPEN test
./ ATTRIB test
./ CLOSE_WRITE,CLOSE test

Je modifie ensuite le fichier
# echo "coucou" >> /tmp/test

la commande inotifywait affiche :
./ OPEN test
./ MODIFY test
./ CLOSE_WRITE,CLOSE test

pour terminer, je supprime le fichier
# rm /tmp/test

la commande inotifywait affiche :
./ DELETE test

donc, si je veux exécuter une action après la création et/ou la modification d'un fichier, il faut utiliser l'évènement inotify CLOSE_WRITE,CLOSE qui correspond donc à l'évènement incron IN_CLOSE_WRITE

ce qui donne dans la table incron :
/tmp    IN_CLOSE_WRITE    /mon_script_a_executer $@ $#

(je passe en paramètre au script les caractères $@ et $# afin de pouvoir effectuer des traitements particuliers en fonction du nom du fichier et de l'évènement. ça peut toujours être utile)

et pour surveiller la suppression d'un fichier il faut utiliser l'évènement inotify DELETE qui correspond à l'évènement incron IN_DELETE

ce qui donne dans la table incron :
/tmp    IN_DELETE    /mon_script_a_executer $@ $#

les évènements peuvent être cumulés :
/tmp    IN_CLOSE_WRITE,IN_DELETE    /mon_script_a_executer $@ $#

de cette manière, un seul script peut être utilisé pour gérer différents évènements effectués sur un fichier.

Si ça peut être utile

Ronan


Proxmox pve-manager/3.4-11/6502936f (running kernel: 2.6.32-40-pve)
Debian 7.9
Ubuntu 10.04.4 LTS / 12.04.5 LTS / 14.04.3 LTS
CentOS release 5.11 (Final)

Hors ligne

#5 Le 27/06/2013, à 22:58

Arbiel

Re : Lancer un script à l'occurence d'un événement

Merci beaucoup pour ce complément d'information.

J'ai installé les paquets nécessaires, et j'ai essayé, comme tu me le montres, de surveiller les activités sur /tmp. Or, il se trouve que j'ai monté tmpfs sur /tmp, et cela doit être la raison pour laquelle j'ai reçu un flot ininterrompu de notifications d'événements.

Je continuerai mes tests plus tard, et je te tiendrai informé de l'avancement de ma prise de connaissance du sujet, et te poserai peut-être des questions complémentaires.

Bonsoir et merci encore

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#6 Le 29/06/2013, à 00:01

Arbiel

Re : Lancer un script à l'occurence d'un événement

Bonsoir Ronan

J'ai à peu près compris ce qu'il faut faire. J'ai compris comment utiliser les diverses commandes inotifywait, incrontab -l et incrontab -e.

J'ai crée une table avec
env EDITOR=gedit incrontab -e
dans laquelle j'ai inscrit la ligne
/home/arbiel/Bureau IN_ALL_EVENTS /.ciel/scripts/surveille.sh $@ $# $% $&

surveille.sh ne fait qu'une chose
zenity --text=xxxxxx
et je l'ai testé séparément.

Mais, lorsque je fais quoi que ce soit sur le bureau, aucun message n'est affiché par zenity. Je reçois bien l'envoi les notifications d'événement sur le terminal où j'ai passé la commande inotifywait, mais rien du tout si je ferme ce terminal.

Quelle étape ai-je oubliée ?

D'avance merci pour ton aide.

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#7 Le 29/06/2013, à 11:51

Arbiel

Re : Lancer un script à l'occurence d'un événement

Je viens de constater que c'est le message de zenity qui n'est pas présenté à l'écran. Le mécanisme fonctionne bien.

Je vais maintenant chercher comment faire pour que le script sache afficher un message à l'écran, car je pense en avoir besoin.

Encore merci pour tes explications

En fait, cela ne marche pas tout à fait  : en supprimant un fichier que je surveille, ou en le mettant à poubelle, les événements IN_MOVE_SELF et IN_DELETE_SELF que je vois apparaître en réponse à inotifywait ne semblent pas appeler le script (au lieu d'afficher un message, le script ajoute à un fichier une ligne qui contient les valeurs de $@ $# et $& et $%)

Arbiel

Dernière modification par Arbiel (Le 29/06/2013, à 16:59)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#8 Le 30/06/2013, à 07:56

rquennec

Re : Lancer un script à l'occurence d'un événement

Bonjour,

Tu as peut être une anomalie dans ton script.
Je vais regarder de mon coté.

Ronan


Proxmox pve-manager/3.4-11/6502936f (running kernel: 2.6.32-40-pve)
Debian 7.9
Ubuntu 10.04.4 LTS / 12.04.5 LTS / 14.04.3 LTS
CentOS release 5.11 (Final)

Hors ligne