Ho una sceneggiatura che deve essere eseguita ogni cinque secondi. So che cron
può svolgere compiti di minuto in minuto, ma c'è un modo per eseguire qualcosa ogni secondo?
sleep 5
fa una pausa (forse in un ciclo) per 5 secondi) ...?
Ho una sceneggiatura che deve essere eseguita ogni cinque secondi. So che cron
può svolgere compiti di minuto in minuto, ma c'è un modo per eseguire qualcosa ogni secondo?
sleep 5
fa una pausa (forse in un ciclo) per 5 secondi) ...?
Risposte:
Cron consente solo per almeno un minuto. Quello che potresti fare è scrivere uno script di shell con un ciclo infinito che esegua il tuo compito e poi dorme per 5 secondi. In questo modo l'attività verrà eseguita più o meno ogni 5 secondi, a seconda della durata dell'attività stessa.
#!/bin/bash
while true; do
# Do something
sleep 5;
done
Puoi creare un my-task.sh
file con i contenuti sopra ed eseguirlo sh my-task.sh
. Facoltativamente, è possibile configurarlo supervisor
come servizio in modo che possa avviarsi all'avvio del sistema, ecc.
Sembra davvero che tu stia facendo qualcosa che probabilmente non dovresti fare però. Questo sembra sbagliato .
Potresti avere un cron
lavoro dare il via a uno script ogni minuto che avvii così 12 processi in background:
* * * * * ~/dostuff.sh
dostuff.sh
:
(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &
La mia domanda, tuttavia, è: cosa su EARTH potresti fare che deve essere eseguito ogni 5 secondi?
/media
directory per un'unità che collego a USB per i backup automatici ...
What on EARTH
- statistiche, garbage collection, sincronizzazione dei file, stato online, il nome.
Basta usare un loop:
while true ; do ./your-script & sleep 5; done
Questo avvierà il tuo script come processo in background, dormirà per 5 secondi, quindi ripeterà il ciclo. È possibile utilizzare Ctrl-C per interromperlo o utilizzare qualsiasi altra condizione anziché true
, ad esempio, ! test -f /tmp/stop-my-script
per eseguire il ciclo solo mentre il file /tmp/stop-my-script
non esiste.
bash: syntax error near unexpected token ';'
, quindi l'ho tolto. Ho bash 4.3.11. Il mio comando viene eseguito rapidamente, quindi va bene se viene eseguito in primo piano.
./your-script
eseguire in background (durante la sospensione di 5 secondi), è possibile mantenere &
ma rilasciare ;
. Poiché &
serve allo scopo di separare i comandi, non è necessario (e apparentemente non consentito) averlo ;
dopo sulla stessa linea. Un altro modo è scrivere il ciclo su più righe (con un'interruzione di riga dopo &
e, facoltativamente, anche di interruzioni di riga dopo do
e prima done
). Poiché il ;
dopo &
sembra essere un errore di battitura, l'ho rimosso. blueyed: sentitevi liberi di rimettere la ;
schiena se lo volete davvero; in tal caso, suggerisco anche di aggiungere una spiegazione.
È possibile utilizzare il pacchetto GNU mcron , un'alternativa "Vixie cron".
http://www.gnu.org/software/mcron/manual/mcron.html#Top
"Può facilmente consentire la definizione di punti temporali più fini, ad esempio secondi. In linea di principio, questo potrebbe essere esteso a microsecondi, ma questo non è implementato."
mcron
richiede sendmail
l'installazione e l'attivazione di default. come disabilitarlo?
La configurazione minima in cron è minuti, non è possibile impostarla per 5 secondi. È possibile utilizzare Quartz che consente secondi. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html
Usa cactus per monitorare il router e lo switch, ma Cron consente solo per almeno un minuto, quindi se una porta / dispositivo è inattivo, non ci sono avvisi fino a due minuti.
Puoi usare un'unità timer SystemD, che attiverà un servizio - che avresti impostato per fare quello che vuoi - ogni 5 secondi.
Supponiamo che la tua unità di servizio venga chiamata mystuff.service
e installata /etc/systemd/system
(controlla i servizi utente di SystemD se vuoi sostituire un crontab di un utente), quindi puoi scrivere un'unità timer per eseguire il servizio all'avvio e poi ogni 5 secondi, in questo modo:
/etc/systemd/system/mystuff.timer
[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target
Quindi ricaricare la configurazione del sistema, abilitare l'unità timer e avviarla.
Ho fatto questo tipo di cose con molto successo (e il risultato finale dura settimane alla volta, fino al riavvio della macchina). Per quanto riguarda quello che stavo facendo adesso, aggiornare le informazioni e metterle nella cache - aggiornando ogni 10 secondi.
#!/bin/sh
SLEEP=5
# do stuff
sleep $SLEEP
# do stuff
sleep $SLEEP
# do stuff
sleep $SLEEP
# do stuff
sleep $SLEEP
# echo and restart...
exec $0
'Exec $ 0' riavvia lo script, ma sostituisce lo script in esecuzione. Inizialmente può essere avviato con una riga '@reboot' di crontab.
while
ciclo invece di riavviare ripetutamente lo script?