Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Lancer un script sous forme d'un daemon

14 réponses
Avatar
Eric Delcamp
Bonjour,
J'ai beau cherché un peu partout, mais comme la question est un poil
difficile a bien exprimer en anglais, je ne trouve pas de réponse
satisfaisante sur Google. Voici le probleme :
J'ai un programme qui se lance en shell et dont je veux etre sur qu'il
soit toujours lancé, meme s'il plante. Je cherche donc une commande qui
surveille ce processus et le relance via le script s'il se termine.
J'aimerai ne pas passer par une commande (ps | grep ) car il me semble
que sous Fedora Core 3 il existe qq chose de plus intuitif.
Merci.


PS: sous Fedora toujours, il me semble qu'il existe un systeme de
monitoring de gateway internet et qui peut basculer vers un systeme de
secours en cas de defaillance (si on a 2 passerelles), mais impossible
de remettre la main sur la doc. Un lien ?

10 réponses

1 2
Avatar
Rakotomandimby (R12y) Mihamina
( Fri, 07 Jan 2005 16:32:27 +0100 ) Eric Delcamp :

Bonjour,


Bonjour

J'ai un programme qui se lance en shell et dont je veux etre sur qu'il
soit toujours lancé, meme s'il plante.


??!

- Si il plante, il peut encore etre listé dans les processes actifs, donc
inutile, voire impossible de le relancer (par exemple si il bind un port)

- Un process qui a planté ne devrais pas etre relancé sans qu'on aie
identifié la cause du plantage. Sinon c'est le bordel. Et toi, tu veux
forcer le relancement aveuglément. C'est mal.

Je cherche donc une commande qui
surveille ce processus et le relance via le script s'il se termine.


- Si un programme quelconque plante, ben il ne peut pas envoyer un signal
du genre "SIGPLANTE" puisqu'il est planté. Il n'existe donc en general
aucun moyen de savoir si un process a planté sauf si disparait de la
liste des processes actifs.

- Evidemment, si il s'est auto-killé, alors c'est plus simple.
--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)

Avatar
John Mackerel
Eric Delcamp wrote:

J'ai un programme qui se lance en shell et dont je veux etre sur qu'il
soit toujours lancé, meme s'il plante. Je cherche donc une commande qui
surveille ce processus et le relance via le script s'il se termine.


http://cr.yp.to/daemontools.html

Avatar
Nicolas George
R12y wrote in message :
- Si un programme quelconque plante, ben il ne peut pas envoyer un signal
du genre "SIGPLANTE" puisqu'il est planté. Il n'existe donc en general
aucun moyen de savoir si un process a planté sauf si disparait de la
liste des processes actifs.


Si : il envoit un SIGCHLD (ou plutôt le noyau le fait) à son père.

Donc un bête

while true; do
script
done

ferait l'affaire.

Mais je suis d'accord avec toi : la priorité numéro 1 est d'identifier la
cause du plantage et de la corriger.

Avatar
l'indien
On Fri, 07 Jan 2005 16:48:31 +0100, Rakotomandimby (R12y) Mihamina wrote:

( Fri, 07 Jan 2005 16:32:27 +0100 ) Eric Delcamp :

Bonjour,


Bonjour

J'ai un programme qui se lance en shell et dont je veux etre sur qu'il
soit toujours lancé, meme s'il plante.


??!

- Si il plante, il peut encore etre listé dans les processes actifs, donc
inutile, voire impossible de le relancer (par exemple si il bind un port)


Non. Quand un process reçoit un signal qui le tue, il devient zombie. Il
est impossible qu'il reste actif. Il est possible que le programme trappe
le signal mais dans ce cas ... il ne plante pas ! Le seul cas ou le
process reste listé "actif" c'est quand il est executé par un debuggeur
(en fait quand un autre process, généralement son père, a activé le
mode ptrace). C'est le seul cas ou un plantage ne libère pas les
ressources.

- Un process qui a planté ne devrais pas etre relancé sans qu'on aie
identifié la cause du plantage. Sinon c'est le bordel. Et toi, tu veux
forcer le relancement aveuglément. C'est mal.


C'est très juste...

Je cherche donc une commande qui
surveille ce processus et le relance via le script s'il se termine.


- Si un programme quelconque plante, ben il ne peut pas envoyer un signal
du genre "SIGPLANTE" puisqu'il est planté. Il n'existe donc en general
aucun moyen de savoir si un process a planté sauf si disparait de la
liste des processes actifs.


Bien sur que si. Il y a deux façons de s'en sortir:
- le programme trappe tous les signaux qui le tue par défaut (sauf
SIGKILL puisque c'est impossible ;-) ) et lorsqu'il reçoit ce signal,
soit se relance lui même, soit envoie un signal pré-défini
(généralement SIGHUP) à son père pour lui dire de tout réinitialiser.
- le programme crashe tout bêtement et son père reçoit alors un SIGCHLD
du noyau. Mais même s'il pour une raison quelconque il ne le recevait
pas, il suffit de faire de temps en temps des waitpid en mode non bloquant
pour savoir qu'un process fils s'est terminé: c'est souvent implémenté
comme celà car les signaux Unix ont la facheuse tendance à se
déclencher quand il ne faudrait pas et il est plus simple de poller un
état que de prévoir un programme complètement asynchrone.

Il y a, sur toutes les machines Linux, un process expréssément dédié
à cette tâche, et uniquement à celà: init !
La méthode standard pour qu'un daemon soit géré et relancé
automatiquement, c'est de le mettre en mode "respawn" dans l'inittab pour
les runlevels ou il doit tourner. C'est extrèmement simple et sur de
marcher.

- Evidemment, si il s'est auto-killé, alors c'est plus simple.


Non. C'est exactement la même chose.


Avatar
Nicolas George
l'indien wrote in message :
- Si il plante, il peut encore etre listé dans les processes actifs, donc
inutile, voire impossible de le relancer (par exemple si il bind un port)
Non. Quand un process reçoit un signal qui le tue, il devient zombie. Il

est impossible qu'il reste actif. Il est possible que le programme trappe
le signal mais dans ce cas ... il ne plante pas !


Ça dépend ce qu'on entend par planter. Un processus qui est parti dans une
boucle infinie à attendre des données sur un fd fermé ou une connerie comme
ça, on peut raisonnablement dire qu'il est planté. Mais rien ne permet
génériquement de le déterminer¹. La solution consiste alors à avoir un
processus qui surveille si le service qui est censé être assuré l'est
effectivement.

Mais bien sûr, la bonne solution est de supprimer l'origine du plantage.


1 : démonstration : soit un test universel de plantage d'un processus, alors
j'écris un démon qui fait son travail si et seulement si le test signale
qu'il est planté.


Avatar
l'indien
On Sat, 08 Jan 2005 01:33:04 +0000, Nicolas George wrote:

l'indien wrote in message :
- Si il plante, il peut encore etre listé dans les processes actifs, donc
inutile, voire impossible de le relancer (par exemple si il bind un port)
Non. Quand un process reçoit un signal qui le tue, il devient zombie. Il

est impossible qu'il reste actif. Il est possible que le programme trappe
le signal mais dans ce cas ... il ne plante pas !


Ça dépend ce qu'on entend par planter. Un processus qui est parti dans une
boucle infinie à attendre des données sur un fd fermé ou une connerie comme
ça, on peut raisonnablement dire qu'il est planté. Mais rien ne permet
génériquement de le déterminer¹. La solution consiste alors à avoir un
processus qui surveille si le service qui est censé être assuré l'est
effectivement.


Bon OK, c'est un problème de vocabulaire...
Ce que tu décris, j'appelle ça un bug, mais pas un plantage...
Pour ces cas là, il faut appliquer le principe du watchdog:
le process à surveiller doit écrire dans un fichier (plutôt une socket
unix ou un pipe...) régulièrement sous peine d'être relancé. Si c'est
fait correctement, ce genre de bug sera dépisté.

Mais bien sûr, la bonne solution est de supprimer l'origine du plantage.


Bien sur. Mais il est peut être interressant d'avoir un process qui fait
le monitoring des daemons et prévient l'administrateur système s'il a à
intervenir. Il peut même faire un core-dump des process au moment ou il
décide de les relancer pour faciliter le debug. A mon avis, ça pourrait
mériter d'être une feature standard d'init...



Avatar
Nicolas George
l'indien wrote in message :
Pour ces cas là, il faut appliquer le principe du watchdog:
le process à surveiller doit écrire dans un fichier (plutôt une socket
unix ou un pipe...) régulièrement sous peine d'être relancé.


Euh, non, dans ce sens-là, ça ne marche pas : le démon peut être tout à fait
opérationnel au moment de dire périodiquement qu'il foncionne, et pourtant
incapable d'assurer le service qu'il doit assurer. Typiquement, si la
structure est ainsi :

boucle infinie {
attendre
si connexion
gérer connexion
si timeout
écrire pour le watchdog
}

gérer connexion {
si quelque chose ne marche pas (*)
retour
faire le service
}

Si le problème est là où j'ai mis une étoile, le démon écrira sans problème
pour le watchdog, mais sera tout à fait inopérant.

La seule solution viable pour un watchdog, c'est de tester précisément sur
le service qui doit être assuré : faire une requête web sur un serveur web,
tenter d'envoyer un mail sur un serveur SMTP, etc. Évidemment, ça ne peut
pas tester tous les cas.

Avatar
Rakotomandimby (R12y) Mihamina
( Fri, 07 Jan 2005 23:36:23 +0000 ) Nicolas George :
- Si un programme quelconque plante, ben il ne peut pas envoyer un
signal du genre "SIGPLANTE" puisqu'il est planté.


Si : il envoit un SIGCHLD (ou plutôt le noyau le fait) à son père.


Ah?!
Et tous les process ont des peres (et des fils)? Je dis ca parceque si
chaque process a un fils, ce meme fils aura un fils, etc etc... On en
finira pas.

Ou bien c'est parceque c'est un deamon, c'est pour ca?
--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)


Avatar
Nicolas George
R12y wrote in message :
Et tous les process ont des peres (et des fils)?


Tout processus sauf init a un père. Cf. l'option f de ps (qui bizarrement ne
montre pas la parenté avec init).

Avatar
l'indien
On Sat, 08 Jan 2005 14:06:40 +0000, Nicolas George wrote:

l'indien wrote in message :
Pour ces cas là, il faut appliquer le principe du watchdog:
le process à surveiller doit écrire dans un fichier (plutôt une socket
unix ou un pipe...) régulièrement sous peine d'être relancé.


Euh, non, dans ce sens-là, ça ne marche pas : le démon peut être tout à fait
opérationnel au moment de dire périodiquement qu'il foncionne, et pourtant
incapable d'assurer le service qu'il doit assurer. Typiquement, si la
structure est ainsi :

boucle infinie {
attendre
si connexion
gérer connexion
si timeout
écrire pour le watchdog
}

gérer connexion {
si quelque chose ne marche pas (*)
retour
faire le service
}

Si le problème est là où j'ai mis une étoile, le démon écrira sans problème
pour le watchdog, mais sera tout à fait inopérant.


Oui, mais là, franchement, ça tient de la bêtise...
Si un programme voit explicitement qu'il ne peut pas assurer son service,
il n'y a pas lieu d'utiliser un autre programme pour le monitorer !
Si le programme est en erreur grave, qu'il ne peut pas corriger, il se
termine ou se réinitialise. Tout autre comportement est absurde.

La seule solution viable pour un watchdog, c'est de tester précisément sur
le service qui doit être assuré : faire une requête web sur un serveur web,
tenter d'envoyer un mail sur un serveur SMTP, etc. Évidemment, ça ne peut
pas tester tous les cas.


C'est loin d'être toujours possible et quand c'est possible, ce n'est pas
toujours sain... En tout cas, ce n'est plus un watchdog.


1 2