cron: eseguire un process ma solo se non è in esecuzione?

C'è un modo per indicare a cron di eseguire un'applicazione ma non eseguirla se un process è già esistito?

il modo più semplice, utilizzare pgrep

in crontab:

* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1 

Esegui uno script, anziché direttamente il programma. Ci sono molte possibilità. Per esempio :

 MYPROG="myprog" RESTART="myprog params" PGREP="/usr/bin/pgrep" # find myprog pid $PGREP ${MYPROG} # if not running if [ $? -ne 0 ] then $RESTART fi 

Questo script non verrà eseguito nuovamente se l'istanza precedente non è terminata. Se non si desidera eseguire qualcosa se un altro process specifico è in esecuzione, vedere lo script di harrymc.

 DATE=`date +%c`; ME=`basename "$0"`; LCK="./${ME}.LCK"; exec 8>$LCK; if flock -n -x 8; then echo "" echo "Starting your script..." echo "" [PUT YOUR STUFF HERE] echo "" echo "Script started $DATE"; echo "Script finished `date +%c`"; else echo "Script NOT started - previous one still running at $DATE"; fi 

È ansible utilizzare un file di block nello script, ma per favore vedere Gestione processi .

flock è una utility che può essere utilizzata.

Questo è di solito gestito dal programma stesso piuttosto che da cron . Esistono due tecniche standard:

1) grep l'output di ps per vedere se c'è un process da quel nome già in esecuzione

2) Al momento dell'avvio, controllare prima l'esistenza di un file pid (id process), di solito a /var/run/program_name.pid e, se esiste, leggere il pid dal file e verificare se tale process ancora esiste ; se lo fa, si rifiuta di iniziare. Se il file pid non esiste o il pid nel file è andato via, quindi creare un file pid, scrivere il tuo id di process in esso e continuare con l'avvio normale.

Mentre è tecnicamente ansible scrivere pipes bash che farà uno di questi direttamente nella tua crontab, è meglio aggiungerli al programma in fase di avvio (in modo che essi si applichino non import come viene avviato) o scrivere uno script wrapper a gestire questo, come ha suggerito il harrymc.