Vorrei un demone che possa trasformare uno script o un comando generico e arbitrario in un demone .
Ci sono due casi comuni che vorrei trattare:
Ho uno script che dovrebbe essere eseguito per sempre. Se mai muore (o al riavvio), riavvialo. Non lasciare mai che ci siano due copie in esecuzione contemporaneamente (rileva se una copia è già in esecuzione e non avviarla in quel caso).
Ho un semplice script o un comando da riga di comando che vorrei continuare a eseguire ripetutamente per sempre (con una breve pausa tra le esecuzioni). Anche in questo caso, non consentire l'esecuzione simultanea di due copie dello script.
Ovviamente è banale scrivere un ciclo "while (true)" attorno allo script nel caso 2 e quindi applicare una soluzione per il caso 1, ma una soluzione più generale risolverà direttamente il caso 2 poiché si applica allo script nel caso 1 come bene (potresti volere solo una pausa più breve o nessuna pausa se la sceneggiatura non è destinata a morire mai (ovviamente se la sceneggiatura non muore mai, allora la pausa non ha importanza)).
Si noti che la soluzione non dovrebbe comportare, ad esempio, l'aggiunta di codice di blocco dei file o registrazione PID agli script esistenti.
Più specificamente, vorrei un programma "daemonize" che posso eseguire come
% daemonize myscript arg1 arg2
o, ad esempio,
% daemonize 'echo `date` >> /tmp/times.txt'
che manterrebbe un elenco crescente di date aggiunto a times.txt. (Nota che se l'argomento (i) per demonizzare è uno script che viene eseguito per sempre come nel caso 1 sopra, allora daemonize farà comunque la cosa giusta, riavviandolo quando necessario.) Potrei quindi inserire un comando come sopra nel mio .login e / o cron ogni ora o minuziosamente (a seconda di quanto fossi preoccupato che morisse inaspettatamente).
NB: Lo script daemonize dovrà ricordare la stringa di comando che sta demonizzando in modo che, se la stessa stringa di comando viene nuovamente daemonizzata, non avvierà una seconda copia.
Inoltre, la soluzione dovrebbe funzionare idealmente sia su OS X che su Linux, ma le soluzioni per l'una o l'altra sono benvenute.
EDIT: Va bene se devi invocarlo con sudo daemonize myscript myargs
.
(Se sto pensando a tutto questo in modo sbagliato o ci sono soluzioni parziali rapide e sporche, mi piacerebbe sentirlo anche io.)
PS: Nel caso sia utile, ecco una domanda simile specifica per Python.
E questa risposta a una domanda simile ha quello che sembra essere un utile idioma per una demonizzazione rapida e sporca di uno script arbitrario: