Cron in esecuzione ogni 15 secondi


18

Potresti consigliarmi cosa scrivere in crontabmodo che esegua un lavoro (per i test che userò /usr/bin/chromium-browser) ogni 15 secondi?


Invece di crontab, fai affidamento su qualche altro sistema di gestione degli eventi, ad esempio: il modulo every.pm di Perl ti aiuterà a farlo.
Nikhil Mulley,

Risposte:


27

Non puoi scendere al di sotto di un minuto di granularità con cron. Quello che puoi fare è, ogni minuto, eseguire uno script che esegue il tuo lavoro, attende 15 secondi e si ripete. La seguente linea crontab inizierà some_jobogni 15 secondi.

* * * * * for i in 0 1 2; do some_job & sleep 15; done; some_job

Questo script presuppone che il lavoro non richiederà mai più di 15 secondi. Il seguente script leggermente più complesso si occupa di non eseguire l'istanza successiva se si impiegava troppo tempo per eseguirla. Si basa sul datesupporto del %sformato (ad es. GNU o Busybox, quindi starai bene su Linux). Se lo metti direttamente in un crontab, nota che i %caratteri devono essere scritti come \%in una linea crontab.

end=$(($(date +%s) + 45))
while true; do
  some_job &
  [ $(date +%s) -ge $end ] && break
  sleep 15
  wait
done
[ $(date +%s) -ge $(($end + 15)) ] || some_job

Noterò comunque che se hai bisogno di eseguire un lavoro ogni 15 secondi, cron è probabilmente l'approccio sbagliato. Sebbene gli unice siano bravi con processi di breve durata, il sovraccarico di lanciare un programma ogni 15 secondi potrebbe non essere trascurabile (a seconda di quanto sia impegnativo il programma). Non è possibile eseguire la propria applicazione continuamente e far eseguire il suo compito ogni 15 secondi?


potrebbe anche essere: for i in 1 2 3 4 ; do some_job & sleep 15; done(l'ultimo sleep non influirà sulla prossima esecuzione), ma il modo in cui lo fai è probabilmente migliore per il tempismo della posta cronjob in uscita (inviata subito dopo l'ultimo some_job, entro 15 secondi più tardi in la mia variante)
Olivier Dulac il


13

Approccio diverso rispetto agli altri: esegui 4 cronjob, ciascuno sfalsato di 15 secondi:

* * * * * sleep 00; timeout 15s some_job
* * * * * sleep 15; timeout 15s some_job
* * * * * sleep 30; timeout 15s some_job
* * * * * sleep 45; timeout 15s some_job

Per evitare che il lavoro interferisca con se stesso, limitiamo il suo tempo di esecuzione a 15 secondi tramite GNU coreutils ' timeoutper ciascun lavoro. Si noti, tuttavia, che se il processo non termina correttamente immediatamente alla fine dei 15 secondi, è possibile che si verifichino problemi. Consultare il manuale di comando per i dettagli su come risolverlo se diventa un problema. Inoltre, se il comando impiega più di 15 secondi e il timeout lo uccide, otterrai uno stato di uscita diverso da zero che attiverà un'e-mail cronjob.


Brillante, anche se ripetitivo.
Mike Kormendy,

1
Bello. Se un processo dura a lungo, probabilmente anche il processo successivo finirà su un core diverso. Non sono sicuro di poter impostare deliberatamente l'affinità di base per i lavori Cron, ma ciò potrebbe migliorare ulteriormente questo approccio.
Tim

@Tim buon punto. L'ho affrontato in qualche modo in una modifica.
Otheus,

2

In breve, cron non è così granulare con il tempo. Il periodo più breve che otterrai è di 1 minuto.

#       .---------------- minute (0 - 59)
#       |       .------------- hour (0 - 23)
#       |       |       .---------- day of month (1 - 31)
#       |       |       |       .------- month (1 - 12) OR jan,feb,mar,apr ...
#       |       |       |       |       .----- day of week (0 - 6) (Sunday=0 or 7)  OR sun,mon,tue,wed,thu,fri,sat
#       |       |       |       |       |
#       *       *       *       *       *       command to be executed
        *       *       *       *       /usr/bin/chromium-browser

Tuttavia, potresti scrivere uno script che verrebbe eseguito ogni 15 secondi ...


Ho una linea * * * * * /usr/bin/chromium-browserin crontab. Secondo il manuale dovrebbe funzionare ogni minuto ma nulla è in esecuzione.
xralf,

È difficile scrivere una sceneggiatura del genere? Dovrei fare un'altra domanda o potrebbe essere scritta qui?
xralf,

I lavori Cron non hanno un terminale quindi mi aspetto che il browser fallisca. Potrebbe farlo in silenzio.
BillThor,

I miei log cron si trovano in / var / log / cron per i derivati ​​di redhat, ad es. fedora, centos ecc. Potrebbe anche aiutarti a descrivere esattamente cosa stai cercando di fare in modo che le persone abbiano un quadro completo di ciò che sta accadendo.
rfelsburg,

1

Nel tuo crontab:

* * * *  /usr/bin/chromium-browser_starter

Quindi in /usr/bin/chromium-browser_starter:

#!/bin/sh

# chromium-browser_starter
#
# Schedules /usr/bin/chromium-browser to run every 15 seconds for a minute.
# Intended to be called every minute through crond(8).

for ((secs=0; secs<46; secs+=15)); do
    (sleep $secs; /usr/bin/chromium-browser "$@") &
done

wait

Quando scrivo ps aux | grep chromdopo un minuto, non riesco a vedere il browser Chromium in esecuzione.
xralf,

@xralf: lo script viene eseguito solo per alcuni secondi al massimo. Prova a fare il grepping per sleep.
anfetamachina,
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.