J'aimerais un démoniseur capable de transformer un script ou une commande arbitraire et générique en démon .
Je voudrais traiter deux cas courants:
J'ai un script qui devrait fonctionner pour toujours. S'il meurt (ou au redémarrage), redémarrez-le. Ne laissez jamais deux copies s'exécuter à la fois (détectez si une copie est déjà en cours d'exécution et ne la lancez pas dans ce cas).
J'ai un script simple ou une commande de ligne de commande que j'aimerais continuer à exécuter à plusieurs reprises pour toujours (avec une courte pause entre les exécutions). Encore une fois, n'autorisez pas l'exécution simultanée de deux copies du script.
Bien sûr, il est trivial d'écrire une boucle «while (true)» autour du script dans le cas 2, puis d'appliquer une solution pour le cas 1, mais une solution plus générale résoudra simplement le cas 2 directement puisque cela s'applique au script dans le cas 1 comme eh bien (vous voudrez peut-être juste une pause plus courte ou pas de pause si le script n'est pas destiné à mourir (bien sûr, si le script ne meurt vraiment jamais, la pause n'a pas vraiment d'importance)).
Notez que la solution ne doit pas impliquer, par exemple, l'ajout de code de verrouillage de fichier ou d'enregistrement PID aux scripts existants.
Plus précisément, j'aimerais un programme "daemonize" que je peux exécuter comme
% daemonize myscript arg1 arg2
ou, par exemple,
% daemonize 'echo `date` >> /tmp/times.txt'
qui garderait une liste croissante de dates ajoutées à times.txt. (Notez que si le (s) argument (s) à démoniser est un script qui s'exécute pour toujours comme dans le cas 1 ci-dessus, alors daemonize fera toujours la bonne chose, en le redémarrant si nécessaire.) Je pourrais alors mettre une commande comme ci-dessus dans mon .login et / ou le cron toutes les heures ou toutes les minutes (en fonction de mon inquiétude à ce qu'il meure de façon inattendue).
NB: Le script daemonize devra se souvenir de la chaîne de commande qu'il démonise pour que si la même chaîne de commande est à nouveau démonisée, il ne lance pas une deuxième copie.
En outre, la solution devrait idéalement fonctionner à la fois sur OS X et Linux, mais les solutions pour l'un ou l'autre sont les bienvenues.
EDIT: C'est bien si vous devez l'invoquer avec sudo daemonize myscript myargs
.
(Si je pense à tout cela mal ou qu'il existe des solutions partielles rapides et sales, j'aimerais aussi l'entendre.)
PS: Au cas où cela serait utile, voici une question similaire spécifique à python.
Et cette réponse à une question similaire a ce qui semble être un idiome utile pour une diabolisation rapide et sale d'un script arbitraire: