Ho una sceneggiatura che deve essere eseguita ogni cinque secondi. So che cronpuò svolgere compiti di minuto in minuto, ma c'è un modo per eseguire qualcosa ogni secondo?
sleep 5fa una pausa (forse in un ciclo) per 5 secondi) ...?
Ho una sceneggiatura che deve essere eseguita ogni cinque secondi. So che cronpuò svolgere compiti di minuto in minuto, ma c'è un modo per eseguire qualcosa ogni secondo?
sleep 5fa 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.shfile con i contenuti sopra ed eseguirlo sh my-task.sh. Facoltativamente, è possibile configurarlo supervisorcome 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 cronlavoro 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?
/mediadirectory 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-scriptper eseguire il ciclo solo mentre il file /tmp/stop-my-scriptnon 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-scripteseguire 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 doe 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."
mcronrichiede sendmaill'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.servicee 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.
whileciclo invece di riavviare ripetutamente lo script?