Come eseguire gli script ogni 5 secondi?


66

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?


3
Che problema stai cercando di risolvere? Sei sicuro che cron sia la soluzione giusta?
andol

1
So che cron non è la soluzione giusta. Stavo dicendo che non era nella domanda. Si prega di leggere. Sto cercando di eseguire uno script ogni 5 secondi.
myusuf3,

2
Scusa, suppongo di aver sbagliato leggermente la domanda. Eppure, mi chiedo ancora se stai cercando di risolvere il problema giusto.
Andol

Per le persone che vengono qui cercando come eseguire qualcosa ogni 5 secondi. Consiglio vivamente invece di imparare come programmare in tempo reale con strumenti come socket.io come esempio.
Brandon Bertelsen,

Hai scoperto il comando bash sleep? sleep 5fa una pausa (forse in un ciclo) per 5 secondi) ...?
SDsolar,

Risposte:


64

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 .


Uno può aver bisogno di un cron in esecuzione ogni 5 o anche meno secondi per essere utilizzato nei raschiatori basati su PHP.
Ravish Kumar il

Sembra davvero sbagliato. Se lo includi in un processo cron, avrai processi sovrapposti ogni minuto. Dopo un'ora inizieranno 60 lavori ogni 5 secondi. Se non includi un lavoro cron, beh, potresti non essere in grado di sapere come interromperlo o persino di sapere che esiste.
SeF

35

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?


1
Bene, questo mi è tornato utile quando ho creato uno script che controlla ripetutamente la /mediadirectory per un'unità che collego a USB per i backup automatici ...
VF1

32
What on EARTH- statistiche, garbage collection, sincronizzazione dei file, stato online, il nome.
ruX

3
Riferimenti a API esterne per dati quasi in tempo reale. Eseguire la richiesta ogni 5 secondi è MOLTO meglio che farlo su ogni visualizzazione di pagina.
Sergey Kudriavtsev,

1
Cosa succede se crontab esegue il file dostuff.sh due volte? Ad esempio al 55 ° secondo, lo script viene eseguito ma non è ancora terminato, ma il cron chiama di nuovo lo script, cosa accadrà?
TomSawyer,

2
QUESTO NON VA BENE! Esegue potenzialmente lo script più di una volta alla volta (se impiega più di 5 secondi) che potrebbe portare a una condizione di competizione in qualsiasi file (anche temporaneo) a cui si accede. NON FARE QUESTO se fare la stessa cosa due volte contemporaneamente può causare un problema! (E di solito lo farà!)
Nonny Moose,

27

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.


Se includo la e commerciale, dice 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.
Tyler Collier,

1
@TylerCollier Se fosse necessario ./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.
Eliah Kagan,

@EliahKagan FWIW, funziona su Zsh (nessun errore di sintassi), ma non è davvero necessario. Grazie per la modifica!
brunito il

10

È 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."


Questo è esattamente quello che stavo cercando. Grazie!
SDsolar,

Pubblica questo come risposta alla mia domanda qui: askubuntu.com/questions/922216/… in modo che io possa accettare la tua risposta.
SDsolar,



mcronrichiede sendmaill'installazione e l'attivazione di default. come disabilitarlo?
Ihsan,

2

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


Sembra che il quarzo non sia open source. È corretto?
txwikinger,

Ha una versione open source. Non ha una pagina ma vai alla pagina di download. Non è necessario compilare il modulo, basta fare clic su portami al download.
Cody Harlow,

sembra essere open source almeno per il 2018. github.com/quartz-scheduler/quartz
dogmatic69

2

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.


1
Raccomando di modificare questa risposta per espanderla con dettagli specifici su come eseguire questa operazione. (Vedi anche Come posso scrivere una buona risposta? Per consigli generali su quali tipi di risposte sono considerate più preziose su Ask Ubuntu.)
David Foerster,

2

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.


1
È la soluzione migliore, l'unico aspetto negativo è che cron è molto più facile da visualizzare e configurare. SystemD è una seccatura e inizia con la sua struttura di directory. Ancora il migliore per un intervallo di 5 secondi
John

Il frammento di cui sopra non andrebbe in /etc/systemd/system/mystuff.timer invece di mystuff.service?
Brooks,

@Brooks: sì, mia brutta copia e incolla male dalla mia parte. Fisso.
Guss

Grazie ... felice di sapere che non sono pazzo mentre sto imparando systemd :)
Brooks,

1

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.


8
Perché non utilizzare un whileciclo invece di riavviare ripetutamente lo script?
David Z,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.