Eu gostaria de um daemonizador que pudesse transformar um script ou comando genérico arbitrário em um daemon .
Existem dois casos comuns com os quais eu gostaria de lidar:
Tenho um script que deve ser executado para sempre. Se ele morrer (ou na reinicialização), reinicie-o. Não deixe que haja duas cópias em execução ao mesmo tempo (detecte se uma cópia já está sendo executada e não a execute nesse caso).
Tenho um script simples ou comando de linha de comando que gostaria de executar repetidamente para sempre (com uma pequena pausa entre as execuções). Novamente, não permita que duas cópias do script sejam executadas ao mesmo tempo.
Claro que é trivial escrever um loop "while (true)" em torno do script no caso 2 e, em seguida, aplicar uma solução para o caso 1, mas uma solução mais geral resolverá apenas o caso 2 diretamente, uma vez que se aplica ao script no caso 1 como bem (você pode apenas querer um mais curto ou sem pausa se o script não se destina a morrer nunca (é claro que se o script realmente não nunca morrem, em seguida, a pausa na verdade não importa)).
Observe que a solução não deve envolver, digamos, a adição de código de bloqueio de arquivo ou gravação PID aos scripts existentes.
Mais especificamente, gostaria de um programa "daemonize" que posso executar como
% daemonize myscript arg1 arg2
ou, por exemplo,
% daemonize 'echo `date` >> /tmp/times.txt'
que manteria uma lista crescente de datas anexada a times.txt. (Observe que se o (s) argumento (s) para daemonize for um script que executa para sempre como no caso 1 acima, então daemonize ainda fará a coisa certa, reiniciando-o quando necessário.) Eu poderia então colocar um comando como o acima em meu .login e / ou cron-lo de hora em hora ou minuto (dependendo de quão preocupado eu estava sobre ele morrer inesperadamente).
NB: O script daemonize precisará lembrar a string de comando que está daemonizando para que, se a mesma string de comando for daemonizada novamente, não execute uma segunda cópia.
Além disso, a solução deve funcionar idealmente no OS X e no Linux, mas soluções para um ou outro são bem-vindas.
EDIT: Tudo bem se você tiver que invocá-lo com sudo daemonize myscript myargs
.
(Se estou pensando nisso tudo errado ou há soluções parciais rápidas e sujas, adoraria ouvir isso também.)
PS: Caso seja útil, aqui está uma pergunta semelhante específica para python.
E esta resposta a uma pergunta semelhante tem o que parece ser uma expressão útil para uma demonização rápida e suja de um script arbitrário: