[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Lancer un script shell linux lors de la fermeture du terminal, avec la croix



Bonjour,


> Comment lancer un script shell linux lors de la fermeture du
> terminal, avec la croix. ... ?

On peut potentiellement déjà avoir des problèmes dépendant de la
façon dont le gestionnaire de fenêtre utilisé ferme les fenêtres
avec la croix, s'il y a une croix...  :-)

Normalement, tous le font de manières à laisser le temps à
l'application d'exécuter des tâches de nettoyage avant de
quitter, mais on peut avoir des surprises, en particulier si un
signal SIGKILL, qui ne peut de toute façon pas être trap'é, est
lancé trop tôt...


> J'ai vu sur un forum qu'il serrait question d'utiliser SIGHUP.
>
> Je n'ai pas réussi à reproduire l'exemple proposé. ( appel de
> fonction "a" qui écrit correctement dans un fichier de logs ,
> trap "a" )

Effectivement d'après le manuel signal(7) ça aurait pu avoir du
sens :

       Signal     Value     Action   Comment
       ──────────────────────────────────────────────────────────────────────
       SIGHUP        1       Term    Hangup detected on controlling terminal
                                     or death of controlling process

Mais à l'usage, ça ne passe pas.  Il me semble que ce signal est
plutôt utilisé pour recharger la configuration des dæmons sans
avoir à les redémarrer, ou ce genre de chose, désormais.

Il pourrait néanmoins y avoir une solution.  Si le shell utilisé
est bash, alors il est possible de spécifier un pseudo signal
EXIT à la commande trap (pas SIGEXIT, ce n'est pas un signal
inter processus à proprement parler).  Le code suivant permet par
exemple d'enregistrer la dernière fermeture de shell (testé avec
le gestionnaire dwm en faisant l'équivalent d'un clic sur une
hypothétique croix) :

	last-exit () {
		printf '%s\n' "$(date --rfc-2822)" > ~/.lastexit
	}
	trap last-exit EXIT

L'explication détaillée à propos de EXIT (et de quelque signaux
bonus) est disponible dans le manuel de bash, ou bien en sortie
de la commande :

	$ help trap
	trap: trap [-lp] [[arg] signal_spec ...]
	    Trap signals and other events.
	
	    Defines and activates handlers to be run when the shell receives signals
	    or other conditions.
	    [...]
	    If a SIGNAL_SPEC is EXIT (0) ARG is executed on exit from the shell.  If
	    [...]


Ça marche avec le bash de Debian Sid, je n'ai pas testé avec les
autres niveaux de Debian, donc je ne saurais dire si c'est une
solution éprouvée ou bien si c'est une nouveauté.  :-)


Une autre solution exploitant le fichier ~/.bash_logout aurait pu
être envisagée mais suppose que la fenêtre de terminal a été
lancée avec `bash -l` et non `bash` tout court, qui est une
commande par défaut usuelle.  De plus, le nettoyage
s'appliquerait à toute session utilisateur, et pas seulement dans
le contexte de votre script.


> J'aimerais pouvoir déclancher la suppression d'un dossier, si
> l'utilisateur de quitte pas mon script avec la commande EXIT du
> menu que j'ai créé.

Juste pour éviter les cafouillages, le EXIT que je mentionne est
une entité différente du EXIT de votre menu.

Soyez prudents avec les situations de concurrence également.
Qu'est ce qui se passe quand un terminal dans un autre contexte
est fermé avec la croix ? Est ce que ça va déclencher le script
de nettoyage ?  Est ce bienvenu ?  Et si le programme tourne dans
d'autres terminaux, comment se comporte le nettoyage ?...


À plus,
-- 
Étienne Mollier <etienne.mollier@mailoo.org>


Reply to: