Potresti consigliarmi cosa scrivere in crontab
modo che esegua un lavoro (per i test che userò /usr/bin/chromium-browser
) ogni 15 secondi?
Potresti consigliarmi cosa scrivere in crontab
modo che esegua un lavoro (per i test che userò /usr/bin/chromium-browser
) ogni 15 secondi?
Risposte:
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_job
ogni 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 date
supporto del %s
formato (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?
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)
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 ' timeout
per 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.
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 ...
* * * * * /usr/bin/chromium-browser
in crontab. Secondo il manuale dovrebbe funzionare ogni minuto ma nulla è in esecuzione.
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
ps aux | grep chrom
dopo un minuto, non riesco a vedere il browser Chromium in esecuzione.
sleep
.