cron - cron


cron
Deweloper(zy) AT&T Bell Laboratories
Pierwsze wydanie maj 1975 ; 46 lat temu ( 1975-05 )
Napisane w C
System operacyjny Linux , macOS , FreeBSD
Rodzaj Harmonogram zadań

Narzędzie wiersza polecenia cron , znane również jako zadanie cron, jest harmonogramem zadań w systemach operacyjnych podobnych do Uniksa . Użytkownicy, którzy konfigurują i utrzymują środowiska oprogramowania, używają crona do planowania zadań (polecenia lub skrypty powłoki ) do okresowego uruchamiania w stałych godzinach, datach lub odstępach czasu. Zwykle automatyzuje konserwację systemu lub administrację — chociaż jego uniwersalny charakter sprawia, że ​​jest przydatny do takich rzeczy, jak pobieranie plików z Internetu i pobieranie wiadomości e-mail w regularnych odstępach czasu.

Cron jest najbardziej odpowiedni do planowania powtarzalnych zadań. Planowanie zadań jednorazowych można wykonać za pomocą powiązanego narzędzia at .

Przegląd

Działania crona są sterowane przez plik crontab (tabela cron), plik konfiguracyjny, który określa polecenia powłoki , które mają być uruchamiane okresowo zgodnie z określonym harmonogramem. Pliki crontab są przechowywane tam, gdzie przechowywane są listy zadań i inne instrukcje dla demona crona . Użytkownicy mogą mieć swoje własne pliki crontab i często istnieje systemowy plik crontab (zwykle w /etclub podkatalogu /etc), który mogą edytować tylko administratorzy systemu.

Każda linia pliku crontab reprezentuje zadanie i wygląda tak:

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

Składnia każdej linii oczekuje wyrażenia cron złożonego z pięciu pól, które reprezentują czas wykonania polecenia, po którym następuje polecenie powłoki do wykonania.

Chociaż normalnie zadanie jest wykonywane, gdy wszystkie pola specyfikacji czasu/daty są zgodne z bieżącą godziną i datą, istnieje jeden wyjątek: jeśli zarówno „dzień miesiąca” (pole 3), jak i „dzień tygodnia” (pole 5) są ograniczone ( nie „*”), to jeden lub oba muszą być zgodne z bieżącym dniem.

Na przykład, poniższy kod czyści dziennik błędów Apache minutę po północy (0:01) każdego dnia, zakładając, że domyślna powłoka dla użytkownika cron jest zgodna z powłoką Bourne :

1 0 * * * printf "" > /var/log/apache/error_log

Ten przykład uruchamia program powłoki o nazwie export_dump.sh w każdą sobotę o 23:45 (23:45).

45 23 * * 6 /home/oracle/scripts/export_dump.sh

Uwaga: Możliwe jest również określenie */nuruchamiania dla każdego n-tego przedziału czasu. Ponadto określenie wielu określonych przedziałów czasu można wykonać za pomocą przecinków (np 1,2,3. ). Poniższy tekst będzie wyświetlał „hello world” w wierszu poleceń co 5 minut każdej pierwszej, drugiej i trzeciej godziny (tj. 01:00, 01:05, 01:10, do 03:55).

*/5 1,2,3 * * * echo hello world

Plik konfiguracyjny dla użytkownika można edytować, wywołując, crontab -eniezależnie od tego, gdzie rzeczywista implementacja przechowuje ten plik.

Niektóre cronimplementacje, takie jak popularna czwarta edycja BSD napisana przez Paula Vixie i zawarta w wielu dystrybucjach Linuksa, dodają szóste pole: nazwę użytkownika konta, które uruchamia określone zadanie (z zastrzeżeniem istnienia użytkownika i uprawnień). Jest to dozwolone tylko w crontabach systemu — nie w innych, z których każdy jest przypisany do jednego użytkownika do skonfigurowania. Szóste pole jest alternatywnie czasami używane przez rok zamiast nazwy użytkownika konta — robi to demon nncron dla Windows.

Implementacja crona w Amazon EventBridge nie używa dnia tygodnia opartego na 0, zamiast tego jest to 1-7 SUN-SAT (zamiast 0-6), a także obsługuje dodatkowe funkcje wyrażeń, takie jak pierwszy dzień tygodnia i ostatni dzień -miesiąc.

Niestandardowe, predefiniowane definicje harmonogramów

Niektóre implementacje crona obsługują następujące niestandardowe makra:

Wejście Opis Równoważny
@yearly (or @annually) Uruchamiany raz w roku o północy 1 stycznia 0 0 1 1 *
@monthly Uruchamiany raz w miesiącu o północy pierwszego dnia miesiąca 0 0 1 * *
@weekly Biegaj raz w tygodniu o północy w niedzielę rano 0 0 * * 0
@daily (or @midnight) Biegaj raz dziennie o północy 0 0 * * *
@hourly Uruchom raz na godzinę na początku godziny 0 * * * *
@reboot Uruchom przy starcie Nie dotyczy

@rebootkonfiguruje zadanie do jednorazowego uruchomienia po uruchomieniu demona. Ponieważ cron zazwyczaj nigdy nie jest restartowany, zazwyczaj odpowiada to uruchamianiu komputera. To zachowanie jest wymuszane w niektórych odmianach crona, takich jak ten dostarczony w Debianie , więc zwykłe zrestartowanie demona nie powoduje ponownego uruchomienia @rebootzadań.

@rebootmoże być przydatne, jeśli istnieje potrzeba uruchomienia serwera lub demona dla określonego użytkownika, a użytkownik nie ma dostępu do konfiguracji init, aby uruchomić program.

Uprawnienia Crona

Te dwa pliki odgrywają ważną rolę:

  • /etc/cron.allow - Jeśli ten plik istnieje, musi zawierać nazwę użytkownika, aby użytkownik mógł korzystać z zadań cron.
  • /etc/cron.deny — Jeśli plik cron.allow nie istnieje, ale plik /etc/cron.deny istnieje, to aby używać zadań cron, użytkownicy nie mogą być wymienieni w pliku /etc/cron.deny.

Należy zauważyć, że jeśli żaden z tych plików nie istnieje, to w zależności od parametrów konfiguracyjnych zależnych od ośrodka albo tylko superużytkownik może używać zadań crona, albo wszyscy użytkownicy mogą używać zadań crona.

Obsługa strefy czasowej

Większość implementacji cron po prostu interpretuje wpisy crontab w ustawieniach strefy czasowej systemu, w których działa demon cron. Może to być źródłem sporów, jeśli duża maszyna, z której korzysta wielu użytkowników, ma użytkowników w kilku strefach czasowych, zwłaszcza jeśli domyślna strefa czasowa systemu obejmuje potencjalnie mylący czas letni . Tak więc implementacja crona może w szczególnym przypadku rozpoznać wiersze w postaci "CRON_TZ=<strefa czasowa>" w crontab użytkownika, interpretując kolejne wpisy crontab w odniesieniu do tej strefy czasowej.

Historia

Wczesne wersje

Cron w wersji 7 Unix był usługą systemową (później nazwaną demonem ) wywoływaną, /etc/rcgdy system operacyjny wchodził w tryb wielu użytkowników. Jego algorytm był prosty:

  1. Czytać /usr/lib/crontab
  2. Określ, czy jakieś polecenia muszą zostać uruchomione w bieżącej dacie i godzinie, a jeśli tak, uruchom je jako superużytkownik , root.
  3. Śpij przez minutę
  4. Powtórz od kroku 1.

Ta wersja crona była podstawowa i solidna, ale zużywała również zasoby, niezależnie od tego, czy znalazła pracę do wykonania, czy nie. W eksperymencie przeprowadzonym na Purdue University pod koniec lat 70. XX wieku, którego celem było rozszerzenie usługi crona na wszystkich 100 użytkowników współdzielonego w czasie VAX-a , stwierdzono, że powoduje on zbyt duże obciążenie systemu.

Możliwość wielu użytkowników

Kolejna wersja crona, wraz z wydaniem Unix System V , została stworzona, aby rozszerzyć możliwości crona na wszystkich użytkowników systemu Unix, nie tylko superużytkownika. Choć może się to dziś wydawać trywialne, ponieważ większość systemów uniksowych i uniksopodobnych ma potężne procesory i niewielką liczbę użytkowników, w tamtym czasie wymagało to nowego podejścia do systemu z jednym MIPS, który ma około 100 kont użytkowników.

W numerze Communications of the ACM z sierpnia 1977 r. WR Franta i Kurt Maly opublikowali artykuł zatytułowany „Efektywna struktura danych dla zestawu zdarzeń symulacyjnych”, opisujący strukturę danych kolejki zdarzeń dla dyskretnych systemów symulacyjnych sterowanych zdarzeniami, która wykazała „ wydajność wyższa od powszechnie używanych prostych algorytmów połączonych list", dobre zachowanie przy niejednorodnym rozkładzie czasu i złożoność najgorszego przypadku , gdzie "n" oznacza liczbę zdarzeń w kolejce.

Absolwent Purdue, Robert Brown, recenzując ten artykuł, dostrzegł podobieństwo między cron i dyskretnymi symulatorami zdarzeń i stworzył implementację menedżera listy zdarzeń Franta-Maly (ELM) do eksperymentów. Symulatory zdarzeń dyskretnych działają w czasie wirtualnym , usuwając zdarzenia z kolejki zdarzeń tak szybko, jak to możliwe i przenosząc swoje pojęcie „teraz” do zaplanowanego czasu następnego zdarzenia. Uruchomienie symulatora zdarzeń w „czasie rzeczywistym” zamiast w czasie wirtualnym stworzyło wersję crona, która większość czasu spędzała na spaniu, czekając na zaplanowany czas wykonania zadania na czele listy zdarzeń.

W następnym roku szkolnym na studia magisterskie w Purdue przybyli nowi studenci, w tym Keith Williamson, który dołączył do personelu systemowego na wydziale informatyki. Jako „zadanie na rozgrzewkę” Brown poprosił go o przekształcenie prototypowego crona w usługę produkcyjną, a ten wieloużytkownikowy cron wszedł do użytku w Purdue pod koniec 1979 roku. Ta wersja crona całkowicie zastąpiła crona /etc/cronużywanego na komputerze Wydziału nauki VAX 11/780 z systemem 32/V.

Algorytm używany przez tego crona wygląda następująco:

  1. Po uruchomieniu poszukaj pliku o nazwie .crontabw katalogach domowych wszystkich posiadaczy kont.
  2. Dla każdego znalezionego pliku crontab określ następnym razem w przyszłości, że każde polecenie musi zostać uruchomione.
  3. Umieść te polecenia na liście zdarzeń Franta-Maly wraz z odpowiadającym im czasem i określeniem czasu „pięć pól”.
  4. Wejdź do głównej pętli:
    1. Sprawdź wpis zadania na początku kolejki, oblicz, jak daleko w przyszłości musi zostać uruchomione.
    2. Śpij przez ten czas.
    3. Po przebudzeniu i po sprawdzeniu prawidłowego czasu wykonaj zadanie na początku kolejki (w tle) z uprawnieniami użytkownika, który je utworzył.
    4. Określ kolejny raz w przyszłości, aby uruchomić to polecenie i umieść je z powrotem na liście zdarzeń w tej wartości czasu.

Dodatkowo demon reaguje na sygnały SIGHUP , aby ponownie przeskanować zmodyfikowane pliki crontab i zaplanować specjalne „zdarzenia budzenia” na godzinę i pół godziny, aby wyszukać zmodyfikowane pliki crontab. Pominięto tutaj wiele szczegółów dotyczących niedokładności śledzenia czasu komputera, harmonogramowania alarmów uniksowych, wyraźnych zmian pory dnia i zarządzania procesami, z których wszystkie stanowią większość linii kodu w tym cronie. Ten cron przechwycił również dane wyjściowe stdout i stderr i wysłał je pocztą e-mail do właściciela crontab.

Zasoby zużywane przez tę skalę cron tylko wraz z ilością pracy, jaką jest ona wykonywana i nie rosną z natury w czasie, z wyjątkiem okresowego sprawdzania zmian.

Williamson ukończył studia i opuścił uniwersytet z tytułem magistra informatyki i dołączył do AT&T Bell Labs w Murray Hill w stanie New Jersey, zabierając ze sobą tego crona. W Bell Labs on i inni włączyli polecenie Unixat do crona, przenieśli pliki crontab z katalogów domowych użytkowników (które nie były specyficzne dla hosta) do wspólnego katalogu buforowego specyficznego dla hosta i z konieczności dodał crontabpolecenie, aby umożliwić użytkowników, aby skopiowali swoje crontab do tego katalogu buforowania.

Ta wersja crona później pojawiła się w dużej mierze niezmieniona w Unix System V oraz w BSD i ich pochodnych, Solaris od Sun Microsystems , IRIX od Silicon Graphics , HP-UX od Hewlett-Packard i AIX od IBM . Technicznie rzecz biorąc, oryginalna licencja dla tych wdrożeń powinna pochodzić z Purdue Research Foundation, która sfinansowała pracę, ale miało to miejsce w czasie, gdy takie sprawy nie były przedmiotem zainteresowania.

Nowoczesne wersje

Wraz z nadejściem Projektu GNU i Linuksa pojawiły się nowe crony. Najbardziej rozpowszechnionym z nich jest cron Vixie, pierwotnie zakodowany przez Paula Vixie w 1987 roku. Wersja 3 crona Vixie została wydana pod koniec 1993 roku. Wersja 4.1 została przemianowana na ISC Cron i została wydana w styczniu 2004 roku. Wersja 3 z kilkoma drobnymi poprawkami , jest używany w większości dystrybucji Linuksa i BSD.

W 2007 roku Red Hat rozwidlał vixie-cron 4.1 do projektu cronie i dołączył anacron 2.3 w 2009 roku.

Inne popularne implementacje to anacron i dcron. Jednak anacron nie jest niezależnym programem cron. Inna praca crona musi to nazwać. dcron został stworzony przez Matta Dillona , założyciela DragonFly BSD , a jego opiekę nad nim przejął Jim Pryor w 2010 roku.

W 2003 roku Dale Mellor wprowadził mcron, wariant crona napisany w Guile, który zapewnia kompatybilność krzyżową z cronem Vixie, a także zapewnia większą elastyczność, ponieważ pozwala na użycie dowolnego kodu schematu w obliczeniach harmonogramu i definicjach zadań. Ponieważ zarówno demon mcron, jak i pliki crontab są zwykle napisane w schemacie (chociaż mcron akceptuje również tradycyjne crontab Vixie), skumulowany stan kolejki zadań użytkownika jest dostępny dla ich kodu zadania, który może zostać zaplanowany do uruchomienia, jeśli wyniki innych miejsca pracy spełniają określone kryteria. Mcron jest domyślnie wdrażany w menedżerze pakietów Guix , który zawiera postanowienia ( usługi ) dla menedżera pakietów, aby monadycznie emitować crontab mcron, zapewniając jednocześnie, że pakiety potrzebne do wykonania zadania są zainstalowane i że odpowiednie crontabs poprawnie się do nich odnoszą.

Rozwiązanie webcron planuje regularne uruchamianie zadań pierścieniowych wszędzie tam, gdzie implementacje cron nie są dostępne w środowisku hostingowym .

Wyrażenie CRON

Wyrażenie CRON to ciąg składający się z pięciu lub sześciu pól oddzielonych białymi znakami, które reprezentują zestaw czasów, zwykle jako harmonogram wykonania jakiejś procedury.

Komentarze zaczynają się od znaku komentarza # i muszą znajdować się same w wierszu.

Pole Wymagany Dozwolone wartości Dozwolone znaki specjalne Uwagi
Minuty tak 0–59 * , -
godziny tak 0–23 * , -
Dzień miesiąca tak 1-31 * , - ? L W ? L W tylko w niektórych realizacjach
Miesiąc tak 1–12 lub styczeń–grudzień * , -
Dzień tygodnia tak 0–6 lub niedz–sob * , - ? L # ? L # tylko w niektórych realizacjach
Rok Nie 1970-2099 * , - To pole nie jest obsługiwane w implementacjach standardowych/domyślnych.

W skrótach miesiąca i dnia tygodnia nie jest rozróżniana wielkość liter.

W szczególnym przypadku systemowego pliku crontab (/etc/crontab) pole użytkownika wstawia się przed poleceniem . Zwykle jest ustawiony na „root”.

W niektórych zastosowaniach formatu CRON na początku wzorca znajduje się również pole sekund . W takim przypadku wyrażenie CRON jest ciągiem składającym się z 6 lub 7 pól.

Przecinek ( ,)
Przecinki służą do oddzielania elementów listy. Na przykład użycie „PON, ŚR, PT” w piątym polu (dzień tygodnia) oznacza poniedziałki, środy i piątki.
Myślnik ( -)
Myślnik definiuje zakresy. Na przykład 2000-2010 oznacza każdy rok w latach 2000-2010 włącznie.
Procent ( %)
Znaki procentu (%) w poleceniu, chyba że poprzedzone odwrotnym ukośnikiem (\), są zamieniane na znaki nowej linii, a wszystkie dane po pierwszym % są wysyłane do polecenia jako standardowe wejście.

Znaki niestandardowe

Poniższe znaki są niestandardowymi znakami i istnieją tylko w niektórych implementacjach crona, takich jak harmonogram Quartz Java .

L
„L” oznacza „ostatni”. W przypadku użycia w polu dzień tygodnia pozwala na określenie konstrukcji takich jak "ostatni piątek" (" 5L ") danego miesiąca. W polu dzień miesiąca określa ostatni dzień miesiąca.
W
Znak „W” jest dozwolony w polu dnia miesiąca. Znak ten służy do określenia dnia tygodnia (poniedziałek-piątek) najbliższego danego dnia. Na przykład, jeśli jako wartość w polu dzień miesiąca określono wartość „ 15W ”, oznacza to: „najbliższy dzień tygodnia do 15 dnia miesiąca”. Tak więc, jeśli 15-ty to sobota, wyzwalacz zostanie uruchomiony w piątek 14-tego. Jeśli 15. to niedziela, wyzwalacz uruchamia się w poniedziałek 16. Jeśli piętnasty jest wtorek, to odpala się we wtorek piętnastego. Jeśli jednak jako wartość dnia miesiąca określono „1W”, a pierwszy dzień to sobota, wyzwalacz zostanie uruchomiony w poniedziałek trzeciego dnia, ponieważ nie „przeskakuje” granicy dni miesiąca. Znak „W” można określić tylko wtedy, gdy dzień miesiąca jest pojedynczym dniem, a nie zakresem lub listą dni.
Hasz ( #)
„#” jest dozwolony w polu dzień tygodnia, po którym musi następować liczba od jednego do pięciu. Pozwala na określenie konstrukcji takich jak „drugi piątek” danego miesiąca. Na przykład wpisanie „5#3” w polu dzień tygodnia odpowiada trzeciemu piątkowi każdego miesiąca.
Znak zapytania ( ?)
W niektórych implementacjach używany zamiast ' * ' w celu pozostawienia pustego dnia miesiąca lub dnia tygodnia. Inne implementacje cron zastępują "?" z czasem uruchomienia demona crona, aby ? ? * * * *został zaktualizowany, 25 8 * * * *jeśli cron został uruchomiony o 8:25 rano i działałby o tej porze codziennie, aż do ponownego uruchomienia.
Ukośnik ( /)
W vixie-cron ukośniki można łączyć z zakresami w celu określenia wartości kroku. Na przykład */5 w polu minut oznacza co 5 minut (patrz uwaga poniżej na temat częstotliwości). Jest to skrót od bardziej szczegółowej formy POSIX 5,10,15,20,25,30,35,40,45,50,55,00 . POSIX nie definiuje użycia ukośników; jego uzasadnienie (komentowanie rozszerzenia BSD) wskazuje, że definicja jest oparta na formacie System V, ale nie wyklucza możliwości rozszerzeń.

Zauważ, że częstotliwości w ogóle nie można wyrazić; tylko wartości kroków, które równomiernie dzielą swój zakres, wyrażają dokładne częstotliwości (dla minut i sekund, czyli /2, /3, /4, /5, /6, /10, /12, /15, /20 i /30, ponieważ 60 to podzielne przez te liczby, dla godzin to /2, /3, /4, /6, /8 i /12 ); wszystkie inne możliwe "kroki" i wszystkie inne pola dają niespójne "krótkie" okresy na końcu jednostki czasu przed "zresetowaniem" do następnej minuty, sekundy lub dnia; na przykład wpisanie */5 dla pola dnia czasami wykonuje się po 1, 2 lub 3 dniach, w zależności od miesiąca i roku przestępnego; dzieje się tak, ponieważ cron jest bezstanowy (nie pamięta czasu ostatniego wykonania ani nie liczy różnicy między nim a teraz, co jest wymagane do dokładnego zliczania częstotliwości — zamiast tego cron jest zwykłym dopasowaniem wzorców).

H
Litera „H” jest używana w systemie ciągłej integracji Jenkinsa do wskazania, że ​​podstawiona jest wartość „zaszyfrowana”. Zatem zamiast stałej liczby, takiej jak „ 20 * * * *”, co oznacza 20 minut po godzinie co godzinę, „ H * * * *” oznacza, że ​​zadanie jest wykonywane co godzinę o nieokreślonym, ale niezmiennym czasie dla każdego zadania. Pozwala to na rozłożenie zadań w czasie, a nie na uruchamianie wszystkich w tym samym czasie i rywalizację o zasoby.

Zobacz też

Bibliografia

Zewnętrzne linki