Crond przesunął pięciominutowy harmonogram

22

Czy możliwe jest przesunięcie zestawu skryptów cron do uruchamiania co 5 minut?

Mam dwa skrypty, skrypt 1 zbiera dane z jednej bazy danych i wstawia je do innej, skrypt 2 wyciąga te dane i wiele innych danych i tworzy z nich ładne raporty. Oba skrypty muszą być uruchamiane co 5 minut. Chcę przesunąć skrypt 2 o jedną minutę, aby mógł utworzyć raport z nowych danych. EG Chcę, aby skrypt pierwszy działał, :00, :05, :10, :15 [...]a skrypt drugi działał :01, :06, :11, :16 [...]co godzinę. Skrypty nie są od siebie zależne, a skrypt 2 musi zostać uruchomiony niezależnie od tego, czy skrypt się powiódł, czy nie. Przydałoby się jednak, aby raporty zawierały najnowsze dane. Czy to możliwe z cronem?

Słupek;
Pomyślałem o użyciu obu poleceń w skrypcie powłoki, aby działały natychmiast po sobie, ale to nie zadziałałoby, czasami skrypt 1 może się zawiesić na oczekiwaniu na zewnętrzne interfejsy API itp., Więc uruchomienie może potrwać do 15 minut, ale skrypt 2 musi być uruchamiany co 5 minut, więc zrobienie tego w ten sposób zatrzymałoby / opóźniłoby wykonanie skryptu 2. Gdybym mógł ustawić to w Cron, oznaczałoby to, że skrypt 2 działałby niezależnie od tego, co robił skrypt 1

Plama
źródło

Odpowiedzi:

14

Możesz uruchamiać skrypty, kiedy tylko chcesz cron. Jeśli chcesz uruchamiać skrypt 1 co 5 minut, możesz zacząć tak:

*/5 * * * * /path/to/script1

Ale tak naprawdę jest to tylko skrót dla:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script1

Jeśli chcesz uruchomić skrypt 2 minutę po skrypcie 1, możesz to zrobić:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /path/to/script2

Możesz także to zrobić:

*/5 * * * * /path/to/script1
*/5 * * * * /path/to/script2

A potem na początku skryptu 2 śpij przez minutę:

sleep 60
Larsks
źródło
4
Uśpienie w samym skrypcie jest brzydkim hackem, który powoduje, że ręczne uruchamianie skryptu jest natychmiast bolesne. Istnieje mniej brzydki sposób na włamanie się, czyniąc sen częścią wpisu do crontab, ale jeszcze bardziej elegancki jest po prostu przesunięcie zadań za pomocą poprawnej notacji crontab, której twoja odpowiedź nie dotyka.
Caleb
39

Minutowe pole wprowadzania crontab akceptuje „przyrosty” operatora, co jest nieco mylące, ponieważ wygląda na to, że powinien być matematycznym operatorem „dzielenia przez”, ale nie jest. Najczęściej zobaczysz, że użył czegoś takiego jak poniżej. Zauważ, że nie znajduje to liczb, które można podzielić przez pięć, ale bierze co piąty element z zestawu:

 */5 * * * * command

To mówi cronowi, aby pasował co piąty element ( /5) z zestawu minut 0-59 ( *), ale możesz zmienić ten zestaw w następujący sposób:

 1-59/5 * * * * command

Zajmie to co piąty element z zestawu 1-59, uruchamiając polecenie w minutach 6, 11, 16 itd.

Jeśli potrzebujesz więcej drobnoziarnistych odsunięć niż jedna minuta, możesz zhakować go za pomocą polecenia uśpienia jako części swojego crontab w następujący sposób:

 */5 * * * * sleep 15 && command

Spowodowałoby to uruchomienie zadania co pięć minut, ale tak naprawdę polecenie nie uruchomiło się po 15 sekundach od minuty. W przypadku krótkich zadań, w których kilka sekund po czymś innym robi różnicę, ale nie chcesz spóźnić się o minutę, jest to dość prosty hack.

Caleb
źródło
1
To lepsza odpowiedź niż zaakceptowana. Ustawienie przesunięcia za pomocą zakresu jest znacznie czystsze niż spanie.
ND Geek
11

Możesz wskazać przesunięcie czasowe za pomocą symbolu +. Na przykład, aby uruchomić w :01, :06, :11, :16 [...], utwórz zadanie takie jak

*/5+1 * * * * command
Kurt
źródło
7
Wydaje się, że to nie działa w niektórych wersjach crona
jhoff
1
Jakiej wersji crona używasz, która obsługuje tę składnię? Cronie chyba tego nie obsługuje.
Matthew G
Mam Cronie na CentOS7, więc najpierw nie wypróbuję tego rozwiązania.
AnneTheAgile,
1

To działało dla mnie:

1/5 * ? * * *

Gdzie 1 to przesunięte minuty. Więc jeśli chcesz przesunąć trzy minuty:

3/5 * ? * * *

Mam to działa w ustawieniach harmonogramu AWS

Zymotik
źródło