it-swarm.it

Come eseguire gli script ogni 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?

65
myusuf3

Cron consente solo per almeno un minuto. Quello che potresti devi fare è scrivere uno script 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

È possibile creare un file my-task.sh con i contenuti sopra ed eseguirlo con sh my-task.sh. Opzionalmente puoi configurarlo con 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 .

64
Tommy Brunn

È possibile che un lavoro cron avvii 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 succede su TERRA cosa potresti fare che deve essere eseguito ogni 5 secondi?

35
warren

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. Puoi usare Ctrl-C per interromperlo o usare qualsiasi altra condizione invece di true, ad es. ! test -f /tmp/stop-my-script per eseguire il ciclo solo mentre il file /tmp/stop-my-script non esiste.

27
blueyed

Potresti usare il pacchetto GNU mcron , un'alternativa "Vixie cron".

http://www.gnu.org/software/mcron/manual/mcron.html#Top

"Può facilmente consentire di specificare punti temporali più fini, ovvero secondi. In linea di principio, questo potrebbe essere esteso a microsecondi, ma non implementato."

10
David

Usa i cactus per monitorare il router e lo switch, ma Cron consente solo un minimo di un minuto, quindi se una porta/dispositivo è inattivo, non ci sono avvisi fino a due minuti.

2
qttty

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

2
Cody Harlow

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 si chiami mystuff.service e sia installata in /etc/systemd/system (controlla Servizi utente SystemD se vuoi sostituire il crontab di un utente), allora puoi scrivere un'unità timer per eseguire il servizio all'avvio e quindi 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.

2
Guss

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 in questo momento, aggiornando le informazioni e inserendole 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.

1
Alister Bulman