Czy mógłbyś mi doradzić, co napisać, crontab
aby uruchamiał jakieś zadanie (do testów użyję /usr/bin/chromium-browser
) co 15 sekund?
Czy mógłbyś mi doradzić, co napisać, crontab
aby uruchamiał jakieś zadanie (do testów użyję /usr/bin/chromium-browser
) co 15 sekund?
Odpowiedzi:
Nie możesz zejść poniżej jednej minuty granulacji z cronem. Co minutę możesz uruchomić skrypt, który uruchamia twoje zadanie, czeka 15 sekund i powtarza. Następująca linia crontab będzie uruchamiana some_job
co 15 sekund.
* * * * * for i in 0 1 2; do some_job & sleep 15; done; some_job
Ten skrypt zakłada, że zadanie nigdy nie zajmie więcej niż 15 sekund. Poniższy nieco bardziej złożony skrypt dba o to, aby nie uruchamiać następnej instancji, jeśli uruchomiono ją zbyt długo. Opiera się na date
obsłudze %s
formatu (np. GNU lub Busybox, więc w Linuksie wszystko będzie dobrze). Jeśli umieścisz go bezpośrednio w tabeli crontab, pamiętaj, że %
znaki muszą być zapisane jak \%
w linii 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
Zauważę jednak, że jeśli musisz uruchamiać zadanie tak często, jak co 15 sekund, cron jest prawdopodobnie niewłaściwym podejściem. Chociaż jednorożce są dobre w przypadku krótkotrwałych procesów, narzut związany z uruchamianiem programu co 15 sekund może być nie bez znaczenia (w zależności od tego, jak wymagający jest program). Czy nie możesz cały czas uruchamiać aplikacji i wykonywać jej zadania co 15 sekund?
1 2 3 4 ; do some_job & sleep 15; done
(ostatni sen nie wpłynie na następny bieg), ale sposób, w jaki to robisz, jest prawdopodobnie lepszy dla czasu wychodzącej poczty cronjob (wysłanej tuż po ostatnim some_job, intead 15s później w mój wariant)
Inne podejście niż inne: uruchom 4 cronjobs, każde z przesunięciem o 15 sekund:
* * * * * sleep 00; timeout 15s some_job
* * * * * sleep 15; timeout 15s some_job
* * * * * sleep 30; timeout 15s some_job
* * * * * sleep 45; timeout 15s some_job
Aby zapobiec zakłócaniu pracy ze sobą, ograniczamy swój bieg w czasie do 15 sekund za pomocą GNU coreutils " timeout
dla każdego zadania. Pamiętaj jednak, że jeśli zadanie nie zakończy się poprawnie natychmiast po upływie 15 sekund, nadal możesz mieć problemy. Szczegółowe informacje na temat rozwiązania tego problemu w instrukcji obsługi można znaleźć w instrukcji obsługi. Pamiętaj również, że jeśli polecenie trwa dłużej niż 15 sekund, a limit czasu go zabije, otrzymasz niezerowy status wyjścia, który wyśle wiadomość e-mail z cronjob.
Krótko mówiąc, cron z czasem nie jest tak szczegółowy. Najkrótszy okres, jaki otrzymasz, to 1 min.
# .---------------- 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
Możesz jednak napisać skrypt uruchamiający się co 15 sekund ...
* * * * * /usr/bin/chromium-browser
w crontab. Zgodnie z instrukcją powinien on działać co minutę, ale nic nie działa.
W twoim crontabie:
* * * * /usr/bin/chromium-browser_starter
Następnie w /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
po minucie, nie widzę uruchomionej przeglądarki Chrome.
sleep
.