Jak powstrzymać Crona przed stemplowaniem?

13

Powiedzmy, że mam kilka skryptów cron, które muszą być uruchamiane co 15 minut. Mógłbym ustawić je tak, aby działały: */15 * * * *ale potem wszystkie działają jednocześnie. Wydaje się głupie, że serwer pozostaje bezczynny przez kilka minut, a następnie nagle próbuje wykonać kilkanaście skryptów jednocześnie.

Czy istnieje sposób na uruchomienie jednego skryptu w minucie 1, 16, 31, 46, a drugi w 2, 17, 32, 47?

Innymi słowy, chcę, aby każdy skrypt był uruchamiany co 15 minut, ale nie dbam o to, aby działały one dokładnie w kwadrans.

Przyciski 840
źródło

Odpowiedzi:

7

Sprawiasz, że jest to trudniejsze niż musi być. Umieść je wszystkie w tym samym wierszu, oddzielając je średnikami:

*/15 * * * * command1 ; command 2 ; command 3

Uruchomi się command1, zaczeka na zakończenie, a następnie uruchomi command2, zaczeka na zakończenie i tak dalej.

laebshade
źródło
15

Jeśli sprawisz, że zadanie crona będzie wyglądać tak: 6-59/15 * * * *będzie ono działać o 6, 21, 36 i 51 minutach po godzinie.

To może nie działać ze wszystkimi wersjami crona.

Ladadadada
źródło
14

Możesz umieścić wszystkie skrypty w katalogu, powiedzmy /etc/cron.15m, a następnie uruchomić cron

*/15 * * * * run-parts /etc/cron.15m

Zakładając, że masz run-partsrozkaz. Jest obecny przynajmniej na wszystkich systemach opartych na Debianie. Uruchamia wszystkie programy wykonywalne w podanym katalogu, pojedynczo w kolejności na liście.

Wadą tej metody jest to, że jeśli jeden ze skryptów zawiesi się, cała reszta będzie czekać i nie zostanie wykonana. Jeśli czas działania wszystkich z nich jest dłuższy niż 15 minut, zadanie zacznie się ponownie uruchamiać i może narastać wiele procesów.

Andrew Schulman
źródło
run-partsjest również obecny w systemach Fedora / Red Hat.
mattdm 11.11.11
9

Najprostszym sposobem na to jest po prostu ręczne skonfigurowanie poleceń, aby były uruchamiane, gdy chcesz:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

Lub możesz napisać skrypt, aby automatycznie wygenerować odpowiednie wpisy crontab (które unikają literówek).

Niektóre wersje crona (prawdopodobnie w tym ta, której używasz) akceptują rozszerzoną składnię:

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14
Keith Thompson
źródło
0

Cron nie jest naprawdę dobry w tym, co próbujesz zrobić. Czy rozważałeś napisanie skryptu, który działa jak demon, który w zasadzie śpi 15 minut, wykonuje polecenie, a następnie wykonuje pętle?

Matt Simmons
źródło
1
Jest z tym kilka potencjalnych problemów. Jednym z nich jest to, że jeśli zrobisz to sleep 300między każdym wykonaniem polecenia, jego wykonanie spowoduje przesunięcie czasu; może działać co 15:10, a nie co 15:00. A jeśli proces w tle umrze lub system uruchomi się ponownie, w przeciwieństwie do crondtego, nie uruchomi się automatycznie. Istnieją sposoby na „demonizowanie” procesu w tle, ale wtedy jest to prawie ponowna implementacja crond.
Keith Thompson,
Tak, zgadzam się, że nie jest to idealne rozwiązanie (choć zawsze możesz wykonać zadanie w tle za pomocą &), ale proszę bardzo.
Matt Simmons,
1
Zamiast tego po prostu poproś crona o uruchomienie jednego skryptu, który wykonuje kolejno wszystkie twoje polecenia. W rzeczywistości jest to tak powszechna potrzeba, że ​​istnieje standardowy skrypt o nazwie run-partsdostarczany z większością instalacji crona, aby to zrobić. Zobacz odpowiedź @ AndrewSchulman.
tylerl,
0

Wiele dystrybucji ma /etc/cron.d/cronhourly, dla których wszystkie skrypty uruchamiane są co godzinę. Możesz nawet określić kolejność, zaczynając od kolejnych numerów, na przykład 01scriptA 02scriptB - powinno to być trywialne ze znajomością crona, którą już masz do wyprodukowania „cronhourlybyfour”, jak to nazywamy w dystrybucji Linuksa Smoothwall :)

Słowo ostrzeżenia: używa części run, jak wcześniej sugerowano, a części run NIE podoba się skryptom z. w nazwie, więc nie nazywaj go „deletehomefolders.sh” nazwij to „01deletehomefolders” i upewnij się, że zaczynasz od właściwego #! wiersz na cokolwiek, co zamierzasz interpretować swój skrypt.

Tom Newton
źródło