OVH Cloud OVH Cloud

Comment gérer les SIGTERM sur emacs ?

10 réponses
Avatar
Damien CASSOU
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Bonjour,

comment puis-je configurer une fonction emacs-lisp pour qu'elle soit
exécutée à chaque fois que emacs reçoit un SIGTERM ?


Merci

- --
Damien
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFCeLdzyl2oT75/6woRAr5nAKCJsqyOgGB7p0N9r6H+WZnXCjsqWACePQTr
Wqp4fyZSmRFCelJG0PKgth4=
=swik
-----END PGP SIGNATURE-----

10 réponses

Avatar
Sébastien Kirche
Le 4 May 2005, Damien CASSOU s'est exprimé ainsi :

Bonjour,



Bonjour,

comment puis-je configurer une fonction emacs-lisp pour qu'elle soit
exécutée à chaque fois que emacs reçoit un SIGTERM ?



Pour la gestion des signaux, je sais qu'il était possible de définir un
hook sur les signaux USR1 et USR2.

Par exemple :
(add-hook 'usr1-signal (function (lambda () (message "Reçu USR1"))))

Que l'onpouvait vérifier avec un «kill -USR1 emacs-pid»

Je l'avais testé à une époque, mais là je viens de voir que ça ne
fonctionne plus.

Par contre on voit un <usr1-signal> is undefined. Idem avec USR2. Je
suppose donc qu'il doit être possible de réagir à USR1 et USR2 mais je
ne sais pas écrire ça.

En revanEn revanche pour un SIGTERM, je ne sais pas si on peut faire de
même.

--
Sébastien Kirche
Avatar
Damien CASSOU
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

comment puis-je configurer une fonction emacs-lisp pour qu'elle soit
exécutée à chaque fois que emacs reçoit un SIGTERM ?



Pour la gestion des signaux, je sais qu'il était possible de définir un
hook sur les signaux USR1 et USR2.

Par exemple :
(add-hook 'usr1-signal (function (lambda () (message "Reçu USR1"))))

Que l'onpouvait vérifier avec un «kill -USR1 emacs-pid»

Je l'avais testé à une époque, mais là je viens de voir que ça ne
fonctionne plus.

Par contre on voit un <usr1-signal> is undefined. Idem avec USR2. Je
suppose donc qu'il doit être possible de réagir à USR1 et USR2 mais je
ne sais pas écrire ça.




N'importe quel signal que je peux envoyer à emacs pour me convenir. Si
quelqu'un sait faire marcher ça, ça serait cool qu'il m'explique.

En revanche pour un SIGTERM, je ne sais pas si on peut faire de
même.



C'est triste

Merci quand même pour cette explication

- --
Damien
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFCefbcyl2oT75/6woRAtUuAKCdQXlpH9ipiej3CSwOz7+1pZCndwCeIIZh
gO6MLOFAjYdMT4D6JiSL1/o =1jgj
-----END PGP SIGNATURE-----
Avatar
Michael Cadilhac
Damien CASSOU writes:

comment puis-je configurer une fonction emacs-lisp pour qu'elle soit
exécutée à chaque fois que emacs reçoit un SIGTERM ?



Pour la gestion des signaux, je sais qu'il était possible de définir un
hook sur les signaux USR1 et USR2.

Par exemple :
(add-hook 'usr1-signal (function (lambda () (message "Reçu USR1"))))

Que l'onpouvait vérifier avec un «kill -USR1 emacs-pid»

Je l'avais testé à une époque, mais là je viens de voir que ça ne
fonctionne plus.




N'importe quel signal que je peux envoyer à emacs pour me convenir. Si
quelqu'un sait faire marcher ça, ça serait cool qu'il m'explique.



C'est tout simple,
(global-set-key [(usr1-signal)] '(lambda () (interactive) (insert "usr1")))

En revanche pour un SIGTERM, je ne sais pas si on peut faire de
même.





C'est même fort probable, n'oublions pas que SIG_TERM est le signal
envoyé quand on veut clore un processus de manière normal.

--
Michael Cadilhac, a.k.a. Micha [mika] |
Epita/LRDE promo 2007 | Please note that you should
2 rue de la Convention | 01.46.70.90.75 | s//@/ my mail address.
94270 Le Kremlin Bicetre | 06.23.20.31.30 |
Avatar
Sébastien Kirche
Le 5 mai 2005, Michael Cadilhac vraute :

C'est tout simple,
(global-set-key [(usr1-signal)] '(lambda () (interactive) (insert
"usr1")))



Tout simplement ?
Pas mal :)

> > En revanche pour un SIGTERM, je ne sais pas si on peut faire de
> > même.

C'est même fort probable, n'oublions pas que SIG_TERM est le signal
envoyé quand on veut clore un processus de manière normal.



Qu'est-ce qui est probable ? Qu'on puisse binder une fonction dessus ou
qu'on ne puisse pas ?

--
Sébastien Kirche
Avatar
Michael Cadilhac
Sébastien Kirche writes:

> > En revanche pour un SIGTERM, je ne sais pas si on peut faire de
> > même.

C'est même fort probable, n'oublions pas que SIG_TERM est le signal
envoyé quand on veut clore un processus de manière normal.



Qu'est-ce qui est probable ? Qu'on puisse binder une fonction dessus ou
qu'on ne puisse pas ?



Que l'on ne puisse pas !
L'équivalent, pour moi, serait d'ajouter un hook sur

.--------------------------------------------------------------------.
| kill-emacs-hook's |
| |
| Hook to be run when kill-emacs is called. Since `kill-emacs' may |
| be invoked when the terminal is disconnected (or in other similar |
| situations), functions placed on this hook should not expect to be |
| able to interact with the user. To ask for confirmation, see |
| `kill-emacs-query-functions' instead. |
`--------------------------------------------------------------------'

Alternativement, selon le signal désiré, suspend-hook peut
convenir.

--
Michael Cadilhac, a.k.a. Micha [mika] |
Epita/LRDE promo 2007 | Please note that you should
2 rue de la Convention | 01.46.70.90.75 | s//@/ my mail address.
94270 Le Kremlin Bicetre | 06.23.20.31.30 |
Avatar
Damien CASSOU
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Michael Cadilhac a écrit :
Damien CASSOU writes:


comment puis-je configurer une fonction emacs-lisp pour qu'elle soit
exécutée à chaque fois que emacs reçoit un SIGTERM ?



Pour la gestion des signaux, je sais qu'il était possible de définir un
hook sur les signaux USR1 et USR2.

Par exemple :
(add-hook 'usr1-signal (function (lambda () (message "Reçu USR1"))))

Que l'onpouvait vérifier avec un «kill -USR1 emacs-pid»

Je l'avais testé à une époque, mais là je viens de voir que ça ne
fonctionne plus.




N'importe quel signal que je peux envoyer à emacs pour me convenir. Si
quelqu'un sait faire marcher ça, ça serait cool qu'il m'explique.




C'est tout simple,
(global-set-key [(usr1-signal)] '(lambda () (interactive) (insert "usr1")))



Ca marche parfaitement, merci.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFCeiEOyl2oT75/6woRAsHvAJ4kOJQoV3YDhVPim038zDOpUEK2fQCfUDn/
tDLrHIEH4GmGKSsAzAa2xKU =YV0t
-----END PGP SIGNATURE-----
Avatar
Damien CASSOU
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Michael Cadilhac a écrit :
Sébastien Kirche writes:
En revanche pour un SIGTERM, je ne sais pas si on peut faire de
même.





C'est même fort probable, n'oublions pas que SIG_TERM est le signal
envoyé quand on veut clore un processus de manière normal.




L'équivalent, pour moi, serait d'ajouter un hook sur

.--------------------------------------------------------------------.
| kill-emacs-hook's |
| |
| Hook to be run when kill-emacs is called. Since `kill-emacs' may |
| be invoked when the terminal is disconnected (or in other similar |
| situations), functions placed on this hook should not expect to be |
| able to interact with the user. To ask for confirmation, see |
| `kill-emacs-query-functions' instead. |
`--------------------------------------------------------------------'

Alternativement, selon le signal désiré, suspend-hook peut
convenir.




Apparement, le hook n'est pas appelé lorsqu'on envoit le signal depuis
l'extérieur, uniquement si on fait C-x C-c :

(defun my-test ()
(condition-case error
(with-temp-buffer
(erase-buffer)
(insert (format "%sn" (current-time-string)))
(write-file (expand-file-name "~/KILL-EMACS.txt"))
nil)
(error
(warn "my-test: %s" (error-message-string error)))))

(add-hook 'kill-emacs-hook 'my-test)

Vous savez pourquoi ?

- --
Damien
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFCeiJSyl2oT75/6woRAljKAKC17TDplKjwJ9epd7biIoaujOn5HQCfZNmh
2XLHIMWhzMAcS/mGOHWnmNg =LF1G
-----END PGP SIGNATURE-----
Avatar
Michael Cadilhac
--=-=- Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

Damien CASSOU writes:

Michael Cadilhac a écrit :
Sébastien Kirche writes:
En revanche pour un SIGTERM, je ne sais pas si on peut faire de
même.





C'est même fort probable, n'oublions pas que SIG_TERM est le signal
envoyé quand on veut clore un processus de manière normal.




L'équivalent, pour moi, serait d'ajouter un hook sur

.--------------------------------------------------------------------.
| kill-emacs-hook's [...] |
`--------------------------------------------------------------------'

Alternativement, selon le signal désiré, suspend-hook peut
convenir.




Apparement, le hook n'est pas appelé lorsqu'on envoit le signal depuis
l'extérieur, uniquement si on fait C-x C-c :



C'est exact, ce hook n'est appelé qu'à l'exécution de la fonction
(kill-emacs), et seulement à ce moment.

Cela dit, quel est le but de tout ceci ? USR-½ n'est pas suffisant ?

--
Michael Cadilhac, a.k.a. Micha [mika] |
Epita/LRDE promo 2007 | Please note that you should
2 rue de la Convention | 01.46.70.90.75 | s//@/ my mail address.
94270 Le Kremlin Bicetre | 06.23.20.31.30 |

--=-=- Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQBCej6pZYNf4qobZ7kRAneYAJ41BDw+nUiufk7G677N7Y7jVwZVTwCgg7Wj
uKmBT6Xyumwa4LM/aDuv5Xg =to+r
-----END PGP SIGNATURE-----
--=-=-=--
Avatar
Michael Cadilhac
--=-=- Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

Damien CASSOU writes:

Michael Cadilhac a écrit :
Sébastien Kirche writes:
En revanche pour un SIGTERM, je ne sais pas si on peut faire de
même.





C'est même fort probable, n'oublions pas que SIG_TERM est le signal
envoyé quand on veut clore un processus de manière normal.




L'équivalent, pour moi, serait d'ajouter un hook sur

.--------------------------------------------------------------------.
| kill-emacs-hook's |
| |
| Hook to be run when kill-emacs is called. Since `kill-emacs' may |
| be invoked when the terminal is disconnected (or in other similar |
| situations), functions placed on this hook should not expect to be |
| able to interact with the user. To ask for confirmation, see |
| `kill-emacs-query-functions' instead. |
`--------------------------------------------------------------------'






Pour information, dans le code d'emacs :

---------------------------------------------------------- src/emacs.c
// [...]
signal (SIGTERM, fatal_error_signal);
// [...]

/* Handle bus errors, invalid instruction, etc. */
SIGTYPE
fatal_error_signal (sig)
int sig;
{
// [...]
kill (getpid (), fatal_error_code);
}
----------------------------------------------------------------------

Preuve s'il en est que l'on ne peut pas récupérer quoi que ce soit
d'un signal TERM.

--
Michael Cadilhac, a.k.a. Micha [mika] |
Epita/LRDE promo 2007 | Please note that you should
2 rue de la Convention | 01.46.70.90.75 | s//@/ my mail address.
94270 Le Kremlin Bicetre | 06.23.20.31.30 |

--=-=- Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQBCeksvZYNf4qobZ7kRAnFQAJ97beG+NL/zjw2zyT38xHqMauQlIwCdHLoa
G59Xj+QBCP8bhJccez/hNJ0 =i8Z9
-----END PGP SIGNATURE-----
--=-=-=--
Avatar
drkm
Michael Cadilhac writes:

Preuve s'il en est que l'on ne peut pas récupérer quoi que ce soit
d'un signal TERM.



Ce qui est étrange. Sur un SIGTERM, il faudrait pouvoir
spécifier des actions particulières.

--drkm