Jak dokładny jest demon cron?

22

Czy harmonogram zadań cron jest naprawdę precyzyjny?

Mam na myśli, że potrzebuję skryptu, aby uruchamiał się każdej nocy możliwie najpóźniej, ALE przed 00:00 następnego dnia.

Idealnie byłoby uruchomić zadanie crona o 23.59 (lub 23.59), ale czy system będzie naprawdę precyzyjny? Ponieważ sekunda ma znaczenie, czy powinienem ustawić pracę crona na 23:58, aby zostawić ją na jakiś czas?

Sebastian
źródło
13
Dlaczego masz te wymagania? Mam wrażenie, że będzie lepszy sposób na robienie tego, co naprawdę próbujesz zrobić, i równie dobrze możesz o to zapytać. (Zajmie to nieco więcej wysiłku niż zaplanowanie pracy crona, ale być może niewiele więcej.)
David Z
Kiedyś używałem starego, głupiego crona z dokładnością do 10 minut.
joshudson
7
Twoje wymagania nie wydają mi się zbyt wiarygodne. Co robisz, jeśli twój system ma duże obciążenie około północy. O ile nie masz systemu RT, nie możesz nic zagwarantować.
Thomas Erker,
Weź pod uwagę, że nawet jeśli uda ci się zdobyć serwer, który jest zawsze dostępny i zawsze może wykonać zadanie w niecałą sekundę, nadal mogą wystąpić problemy. Na przykład twój zegar może zacząć dryfować bez twojej wiedzy. To jest naprawdę bardzo kruche i zgadzam się z powyższymi komentarzami, że system musi się zmienić.
Chris Hayes

Odpowiedzi:

24

Cron może zagwarantować, że praca rozpocznie się nie wcześniej niż w określonym czasie (z zastrzeżeniem dokładności zegara systemowego). Ale nie ma sposobu, aby dać ci jakąkolwiek gwarancję na czas zakończenia pracy. Będzie to zależeć od wielu czynników:

  • Jak obciążony jest system
  • Czym zajmuje się ta praca?
  • Powolność z powodu problemów sprzętowych
  • Powolność z powodu problemów z siecią (zakładając, że praca zależy od sieci)

Radzę zmienić projekt tak, aby określony czas realizacji nie był wymagany.

kasperd
źródło
1
Najłatwiejszym sposobem na to jest prawdopodobnie utworzenie zadania, które jest uruchamiane przez cron, aby utworzyć plik wskazujący, że jest uruchomiony, który jest usuwany za każdym razem, gdy zadanie kończy się (pomyślnie lub nie), a następnie następne zadanie (zakładając, że taki jest cel) poczekaj, aż plik zniknie, zanim cokolwiek zrobi.
CVn
@ MichaelKjörling Powinieneś użyć katalogu, a nie pliku, ponieważ sprawdzanie pliku, a następnie tworzenie go nie jest atomowe .
8bittree
1
@ 8bittree możesz także użyć stada, jeśli jest ono dostępne.
user9517 obsługuje GoFundMonica
1
@ MichaelKjörling Ale po co zawracać sobie głowę przypadkiem, gdy poprawna sprawa jest prostsza?
8bittree
4
@ 8bittree Jeśli użyjesz O_CREATi oflaguje, O_EXCLbędzie on atomowy, dopóki plik będzie w lokalnym systemie plików.
kasperd
14

Przypuszczam, że zależy to od twojego demona cron, ale dokumentacja i standard wskazują, że jeśli określisz minuty, zadanie zostanie wykonane o określonej godzinie.

Widzieć:

Pamiętaj, że twój skrypt zostanie uruchomiony, gdy zegar odmierzy właściwy czas, ale skończy się jakiś czas później.

Falcon Momot
źródło
Mam serwer wirtualny o bardzo niskim obciążeniu, a mimo to cron, który jest ustawiony na uruchamianie co minutę, zaczyna się czasem o 0, 1, 2, czasem do 17. Domyślam się, że cron może być mniej dokładny na serwerze wirtualnym, ponieważ inne procesy poza tym serwerem mogą wpływać na dostępność zasobów, takich jak procesor.
Liam
8

Zwykle cron rozpocznie się o 23:59:00 , przeskanuje wszystkie twoje pliki crontab, odfiltruje tych, którzy są istotni dla 23:59, a następnie je uruchomi. Skanowanie tych plików jest bardzo szybkie, ponieważ nie ma ich wiele i wszystkie zawierają tylko kilka wierszy. Zwykle cronjobs zaczynają się o 23:59:00 lub 23:59:01 Istnieją pewne sposoby celowego spowolnienia tego procesu. (na przykład dodaj miliony linii do crontab). Jeśli system jest całkowicie przeciążony, to również nie działa tak szybko.

Jest to oczywiście zależne od implementacji.

Jeśli potrzebujesz bardzo dokładnych czasów rozpoczęcia, lepiej jest stworzyć program, który śpi do żądanego czasu, a następnie uruchamia się (np. Używając c ++ 11 ). Ale w systemie operacyjnym nie działającym w czasie rzeczywistym to również nie będzie dokładne! Również zegar komputera nie zna dokładnego czasu!

We wszystkich przypadkach zapewnia to tylko, że program rozpocznie się (mniej więcej) w żądanym czasie. Nie ma żadnej gwarancji, że program zakończy się sukcesem do określonego czasu, więc mocno wierzę, że powinieneś coś zmienić w związku z tym wymogiem.

Josef
źródło
2
Wierzę, że crontaby są przechowywane w pamięci - jeśli edytujesz pliki bezpośrednio za crontabem (zamiast crontab -e, który powiadamia cron po zakończeniu), zmiany nie zostaną wprowadzone. cron ma mnóstwo przestojów, aby dowiedzieć się, jakie zadania nadchodzą, może „spać” do momentu, w którym zadanie zostanie uruchomione.
AMADANON Inc.,
0

Zależy to od ogólnego czasu wykonania skryptu i precyzji czasu serwera.

59 23 * * * /some/script/file.sh

uruchomi skrypt dokładnie o 23:59, ale jeśli masz jakieś polecenia, które działają długo, część skryptu może zostać wykonana po północy.

dziwny człowiek
źródło
dokładnie o 23:59 , więc może być od 23:59:00 do 23:59:59?
AL
2
Nie masz sekund w normalnym cronie. Aby uzyskać dodatkowe 59 sekund, musisz dodać „wait (59)” u góry kodu.
Henry's Cat,
4
@AL w praktyce zawsze widziałem, że działa w xx: xx: 00 lub xx: xx: 01, ale w mocno obciążonym systemie nie ma i nie może być żadnych obietnic.
hobbs