Me gustaría un daemonizer que pueda convertir un script o comando genérico y arbitrario en un daemon .
Hay dos casos comunes con los que me gustaría tratar:
Tengo un script que debería ejecutarse para siempre. Si alguna vez muere (o al reiniciar), reinícielo. No permita que nunca haya dos copias ejecutándose a la vez (detecte si una copia ya se está ejecutando y no la inicie en ese caso).
Tengo un script simple o un comando de línea de comando que me gustaría seguir ejecutando repetidamente para siempre (con una breve pausa entre ejecuciones). Nuevamente, no permita que dos copias del script se ejecuten a la vez.
Por supuesto, es trivial escribir un bucle "while (verdadero)" alrededor del script en el caso 2 y luego aplicar una solución para el caso 1, pero una solución más general simplemente resolverá el caso 2 directamente, ya que se aplica al script en el caso 1 como así (puede que sólo quieren una más corta o ninguna pausa si el guión no está destinado a morir nunca (por supuesto, si el guión realmente no nunca mueren después de la pausa en realidad no importa)).
Tenga en cuenta que la solución no debería implicar, por ejemplo, agregar código de bloqueo de archivos o grabación PID a los scripts existentes.
Más específicamente, me gustaría un programa "demonizar" que pueda ejecutar como
% daemonize myscript arg1 arg2
o, por ejemplo,
% daemonize 'echo `date` >> /tmp/times.txt'
que mantendría una lista creciente de fechas adjuntas a times.txt. (Tenga en cuenta que si el (los) argumento (s) para demonizar es un script que se ejecuta para siempre como en el caso 1 anterior, entonces demonizar seguirá haciendo lo correcto, reiniciándolo cuando sea necesario). Entonces podría poner un comando como el anterior en mi .login y / o cron cada hora o cada minuto (dependiendo de cuán preocupado estaba de que muriera inesperadamente).
NB: El script daemonize necesitará recordar la cadena de comando que está demonizando para que si la misma cadena de comando es demonizada nuevamente, no lance una segunda copia.
Además, la solución idealmente debería funcionar tanto en OS X como en Linux, pero las soluciones para uno u otro son bienvenidas.
EDITAR: Está bien si tiene que invocarlo con sudo daemonize myscript myargs
.
(Si estoy pensando en todo esto mal o si hay soluciones parciales rápidas y sucias, también me encantaría escuchar eso).
PD: En caso de que sea útil, aquí hay una pregunta similar específica para Python.
Y esta respuesta a una pregunta similar tiene lo que parece ser un idioma útil para una demonización rápida y sucia de un guión arbitrario: