È possibile eseguire un processo cron ogni 30 secondi senza un comando sleep?
È possibile eseguire un processo cron ogni 30 secondi senza un comando sleep?
Risposte:
Se la tua attività deve essere eseguita di frequente, cron è lo strumento sbagliato. A parte il fatto che semplicemente non avvierà i lavori così frequentemente, rischi anche alcuni seri problemi se il lavoro impiega più tempo per l'esecuzione rispetto all'intervallo tra i lanci. Riscrivi la tua attività per demonizzare ed eseguire in modo persistente, quindi avviala da cron se necessario (assicurandoti che non si riavvierà se è già in esecuzione).
run-one
per assicurarti che un programma / anche uno script PHP non stia avviando un'istanza duplicata. sudo apt-get install run-one
e chiamalo darun-one <normal command>
Candidato per l' abuso più creativo di un comando Linux:
nohup watch -n 30 --precise yourprog >/dev/null &
Se è yourprog
costituito da:
date +%M.%S.%N >> yourprog.out
quindi yourprog.out
potrebbe apparire come:
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
indicando un livello abbastanza buono di precisione.
Ecco una spiegazione delle parti del comando:
nohup
- Ciò impedisce al comando che lo segue, watch
in questo caso, di uscire alla chiusura del terminale.watch
- Questo programma esegue ripetutamente un comando. Normalmente la prima schermata di output dal comando viene visualizzata ogni volta che si watch
esegue il comando.-n 30
- L'intervallo in cui eseguire il comando. In questo caso è ogni trenta secondi.--precise
- Senza questa opzione, watch
esegue il comando dopo intervalli di secondi. Con esso, ogni avviamento del comando inizia sul dell'intervallo se possibile. Se questa opzione non fosse specificata nell'esempio, i tempi sarebbero più tardi e più tardi di più di 30 secondi ogni volta a causa del tempo impiegato per avviare ed eseguire il comando ( yourprog
).yourprog
- Il programma o la riga di comando watch
da eseguire. Se la riga di comando contiene caratteri speciali per la shell (ad es. Spazio o punto e virgola) dovrà essere citato.>/dev/null
- Il maggiore di reindirizza l'output del comando in esecuzione da watch
un file, /dev/null
. Quel file scarta tutti i dati scritti su di esso. Ciò impedisce che l'output venga scritto sullo schermo o, poiché nohup
viene utilizzato, impedisce che l'output venga inviato a un file chiamato nohup.out
.&
- Il watch
comando viene eseguito in background e il controllo viene restituito al processo terminale o padre.Si noti che nohup
il reindirizzamento dell'output e l' &
operatore di controllo in background non sono specifici watch
.
Ecco una spiegazione dello yourprog
script di esempio :
date
- Emette la data e / o l'ora correnti. Può anche impostarli.+%M.%S.%N
- Questo specifica il formato di output date
da utilizzare. %M
è il minuto corrente, %S
è il secondo corrente ed %N
è il nanosecondo corrente.>> yourprog.out
- Questo reindirizza l'output del date
comando su un file chiamato yourprog.out
. Il doppio maggiore di fa sì che l'output venga aggiunto al file su ogni invocazione anziché sovrascrivere il contenuto precedente.Modifica :
Forse un'altra cosa che potrebbe essere abusata (o forse è un uso legittimo) sono i timer di sistema.
Vedi systemd / Timer come un sostituto cron e Cron vs systemd timer .
Proverò a pubblicare un esempio presto.
&
comando esegue il comando in background, restituendo immediatamente il controllo al prompt dei comandi. L'uso del nohup
comando fa sì che il processo in background (in questo caso watch
) ignori il segnale di blocco che viene inviato all'uscita della shell, ad esempio quando si chiude il terminale. ...
>/dev/null
causa l' esclusione dell'output e impedisce la creazione di un nohup.out
file che altrimenti verrebbe creato quando l'output standard è un terminale.
sleep
, è necessario scrivere un ciclo in modo che il processo si ripeta ( watch
fa questo ripetendo per te, come fa cron
). Avresti ancora bisogno nohup
e &
. Un ulteriore problema con sleep
sarebbe la deriva del tempo. L' --precise
opzione di watch
evita questo. Senza di esso o quando si utilizza sleep
in un ciclo, l'intervallo di tempo ha il tempo necessario per l'esecuzione dei comandi o dello script, in modo che ogni esecuzione sia successiva e successiva rispetto a ...
Cron è progettato per svegliarsi ad ogni minuto, quindi non è possibile farlo senza un po 'di hacking, ad esempio dormire come hai detto.
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
Non dimenticare di scrivere qualcosa nel tuo programma in modo che esca se un'istanza precedente è già in esecuzione.
#!/bin/sh
if ln -s "pid=$$" /var/pid/myscript.pid; then
trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
echo "Already running, or stale lockfile." >&2
exit 1
fi
Naturalmente, ciò lascia ancora una piccola opportunità di fallimento, quindi cerca su Google una soluzione migliore applicabile al tuo ambiente.
without a sleep command
Puoi farlo con software di terze parti.
Un'opzione che ha funzionato bene per me è frequ-cron
Permette la precisione in millisecondi e ti dà la possibilità di rinviare l'esecuzione successiva fino a quando quella attuale è uscita.
Avrei un paio di preoccupazioni:
(1) a volte un sistema si impegna e non può avviare esattamente le cose sul punto di 30 secondi, è quindi possibile che nello stesso momento in cui si esegue un lavoro venga visualizzato un altro lavoro e quindi si abbiano 2 (o più) lavori che fanno lo stesso cosa. A seconda della sceneggiatura, potrebbero esserci delle interferenze significative qui. Pertanto, la codifica in uno script di questo tipo dovrebbe contenere un po 'di codice per assicurare che sia in esecuzione solo un'istanza dello script dato contemporaneamente.
(2) Lo script potrebbe avere un sacco di sovraccarico e consumare più risorse di sistema di quanto tu possa desiderare. Questo è vero se si è in competizione con molte altre attività di sistema.
Quindi, come ha scritto un poster, in questo caso prenderei seriamente in considerazione l'idea di inserire un demone in esecuzione con processi aggiuntivi per assicurarmi che rimanga in esecuzione se è di importanza cruciale per le tue operazioni.
voce cron:
* * * * * flock -w0 /path/to/script /path/to/script
script:
while true;do echo doing something; sleep 10s;done
* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log
o
* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script
flock
comando evita di eseguire lo script da più istanze contemporaneamente. Può essere molto importante nella maggior parte dei casi.flock
e i watch
comandi sono disponibili sulla maggior parte delle installazioni di Linuxwatch
comandoUna soluzione, se è per il tuo script o se puoi avvolgerlo:
Meno mal di testa rispetto alla creazione e al monitoraggio di un demone.
* Se stai usando PHP, ricorda clearstatcache ().