Nous avons environ 40 ordinateurs exécutant du matériel et des logiciels identiques. Ils exécutent tous Ubuntu 11.10. Ils ont tous un seul compte d'utilisateur pour se connecter. Le fichier .profile est configuré pour lancer un processus démon. Le code du démon est écrit en C.
Une fois toutes les semaines, nous recevons un rapport indiquant que le démon ne fonctionne plus. Cela ne se produit pas sur tous les ordinateurs mais seulement un ou deux. Nous ne pouvons pas reproduire le problème de manière cohérente.
En regardant le code, l'application se ferme lorsqu'elle reçoit SIGHUP ou SIGTERM.
Si je comprends bien, SIGHUP est généré lorsqu'un utilisateur se déconnecte. Dans notre cas, l'utilisateur ne se déconnecte jamais. Je me demande s'il est possible que SIGHUP ait pu être généré pour une autre raison. Toute autre pensée serait appréciée.
Les signaux peuvent être envoyés à l'aide de l'utilitaire kill
ou kill syscall. Bien sûr, vous pouvez essayer de savoir qui envoie ce signal ou déconnecte vos terminaux ou connexions réseau, mais il existe un moyen pratique plus simple de résoudre votre problème.
Lorsque le code est censé s'exécuter en tant que démon, mais pas vraiment (tout comme le vôtre), il existe un wrapper qui peut transformer n'importe quel programme en démon. Surprise - ce wrapper s'appelle daemon
! Il a beaucoup d'options, probablement le plus important pour vous, l'option de redémarrer automatiquement votre utilitaire s'il venait à mourir pour une raison quelconque.
Si cette commande n'est pas installée sur votre Ubuntu, il suffit de Sudo apt-get install daemon
, et man daemon
pour commencer.
Eh bien, il y a quelques choses à noter à propos de SIGHUP. Tout d'abord, son origine provient du concept de raccrochage, c'est-à-dire de la perte de connexion à une console sur quelque chose comme un modem. Dans le langage moderne, cela signifie généralement qu'il a perdu son contrôle. Sauf si vous avez pris soin de vous détacher de votre terminal, tout programme démarré dans un terminal donné recevra un SIGHUP lorsque le terminal sera fermé. Voir ici pour plus de détails sur la façon de procéder dans votre programme. Les autres options incluent:
screen
ou tmux
Nohup
ou un autre framework de démonisationL'autre possibilité est que quelque chose envoie délibérément à votre processus un SIGHUP qui, par "tradition", est souvent utilisé pour signaler à un processus qu'il doit relire sa configuration.