Uruchomione zadanie Cron co 15 sekund

18

Czy mógłbyś mi doradzić, co napisać, crontababy uruchamiał jakieś zadanie (do testów użyję /usr/bin/chromium-browser) co 15 sekund?

xralf
źródło
Zamiast crontab, polegaj na innym systemie zarządzania zdarzeniami, na przykład: moduł Every.pm Perla pomoże ci to zrobić.
Nikhil Mulley,

Odpowiedzi:

27

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_jobco 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 dateobsłudze %sformatu (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?

Gilles „SO- przestań być zły”
źródło
może być również: dla i w 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)
Olivier Dulac
13

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

Otheus
źródło
Genialny, choć powtarzalny.
Mike Kormendy,
1
Ładny. Jeśli proces trwa długo, następny proces prawdopodobnie również skończy na innym rdzeniu. Nie jestem pewien, czy możesz celowo ustawić podstawowe powinowactwo do zadań Crona, ale to może uczynić to podejście jeszcze lepszym.
Tim
@Tim dobry punkt. Zajęłam się tym nieco w redakcji.
Otheus
2

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

rfelsburg
źródło
Mam wiersz * * * * * /usr/bin/chromium-browserw crontab. Zgodnie z instrukcją powinien on działać co minutę, ale nic nie działa.
xralf
Czy trudno jest napisać taki skrypt? Czy powinienem zadać kolejne pytanie, czy może być tutaj napisane?
xralf
Zadania Crona nie mają terminala, więc oczekiwałbym, że przeglądarka ulegnie awarii. Może to zrobić po cichu.
BillThor 11.04.11.04
Moje dzienniki cron znajdują się w / var / log / cron dla pochodnych redhat, tj. fedora, centos itp. Może ci również pomóc dokładnie opisać, co próbujesz zrobić, aby ludzie mieli pełny obraz tego, co się dzieje.
rfelsburg
1

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
amfetamachina
źródło
Kiedy piszę ps aux | grep chrompo minucie, nie widzę uruchomionej przeglądarki Chrome.
xralf
@xralf - skrypt działa najwyżej przez kilka sekund. Spróbuj grep dla sleep.
amfetamachina