Jeśli kiedykolwiek zarządzałeś serwerem Linux, pracowałeś przy tworzeniu backendu lub konfigurowałeś zautomatyzowane funkcje w chmurze, prawdopodobnie natknąłeś się na ciąg znaków wyglądający mniej więcej tak: 0 2 * * *. Dla niewtajemniczonych wygląda to na literówkę pozostawioną na klawiaturze. Dla administratorów systemów jest to serce nowoczesnej automatyzacji infrastruktury: wyrażenie Cron.
Cron to niewidzialny silnik obsługujący Internet. Zapewnia utworzenie kopii zapasowej bazy danych o 3:00 w nocy, wyzwala e-maile otrzymywane w każdy poniedziałek rano i usuwa tymczasowe pliki serwera, zanim spowodują awarię systemu. Jednak pomimo swojej mocy, składnia jest niezwykle trudna do przeanalizowania przez ludzi. W tym szczegółowym przewodniku odkryjemy tajemnice gwiazdek i nauczymy Cię, jak czytać i pisać harmonogramy cron niczym doświadczony inżynier DevOps.
Co to jest Cron i Crontab?
Cron to program do planowania zadań oparty na czasie, występujący w komputerowych systemach operacyjnych typu Unix. Nazwa „cron” pochodzi od greckiego słowa oznaczającego czas, chronos. Użytkownicy, którzy konfigurują i utrzymują środowiska oprogramowania, używają cron do planowania zadań (poleceń lub skryptów powłoki), aby były uruchamiane okresowo o ustalonych porach, datach i odstępach czasu.
Crontab (tabela Cron) to plik konfiguracyjny, w którym przechowywane są te harmonogramy. Kiedy edytujesz plik crontab za pomocą terminala, piszesz listę instrukcji informujących serwer dokładnie, co i kiedy ma wykonać.
Dekonstrukcja 5 gwiazdek
Standardowe wyrażenie cron składa się z 5 pól oddzielonych spacją. Każde pole reprezentuje określoną jednostkę czasu i są one zawsze odczytywane od lewej do prawej, w dokładnie następującej kolejności:
* * * * * command_to_execute
- - - - -
| | | | |
| | | | +----- Day of the Week (0 - 6) (Sunday=0 or 7)
| | | +------- Month (1 - 12)
| | +--------- Day of the Month (1 - 31)
| +----------- Hour (0 - 23)
+------------- Minute (0 - 59)
Gwiazdka (*) oznacza „każdą możliwą wartość dla tego pola”. Zatem wyrażenie * * * * * dosłownie tłumaczy się jako: „Uruchom co minutę, o każdej godzinie, każdego dnia, każdego miesiąca, każdego dnia tygodnia”.
Modyfikatory składni: kroki, zakresy i listy
The power of cron comes from its modifiers. Nie jesteś ograniczony do konkretnych liczb lub „wszystko”.
1. Modyfikator kroku (/)
Jeśli chcesz, aby skrypt był uruchamiany co 15 minut, użyj kroku. */15 * * * * oznacza „każdą minutę podzielną przez 15”. Będzie kursować o 0, 15, 30 i 45 po pełnej godzinie.
2. Modyfikator zakresu (-)
Jeśli chcesz, aby skrypt działał tylko w godzinach pracy, użyj zakresu. 0 9-17 * * * oznacza „uruchamianie o zerowej minucie, co godzinę od 9:00 do 17:00”.
3. Modyfikator listy (,)
Jeśli chcesz, aby coś działało w określone, nie następujące po sobie dni, użyj listy. 0 0 1,15 * * oznacza „uruchamiany o północy pierwszego i piętnastego dnia miesiąca”.
Przestań zgadywać wyrażenia Crona
Nie ryzykuj uruchamiania skryptu kopii zapasowej co minutę zamiast co miesiąc. Pojedyncza literówka może spowodować awarię serwera produkcyjnego. Skorzystaj z naszego interaktywnego generatora wizualnego, aby bezpiecznie budować i weryfikować ciągi cron.
Otwórz generator zadań CronNajniebezpieczniejszy błąd Crona
Najczęstszym i katastrofalnym błędem popełnianym przez programistów jest pomylenie pola „Minuta”. Przyjrzyjmy się scenariuszowi, w którym chcesz uruchamiać skrypt czyszczenia bazy danych raz na godzinę o 2:00.
Błąd: * 2 * * *
Jeśli napiszesz powyższe, powiesz serwerowi, aby uruchomił skrypt „Co minutę, w drugiej godzinie dnia”. Twój skrypt czyszczenia dużej bazy danych zostanie uruchomiony 60 razy z rzędu, co prawdopodobnie przeciąży procesor, zablokuje tabele bazy danych i spowoduje masową awarię.
Właściwy sposób: 0 2 * * *
To wyraźnie mówi serwerowi, aby działał tylko o „Miucie zero drugiej godziny”. Wykona się dokładnie raz o godzinie 2:00.
Często zadawane pytania (FAQ)
Czy cron uwzględnia strefy czasowe?
Domyślnie cron ocenia wyrażenia na podstawie lokalnego czasu systemowego serwera, na którym działa. Jeśli Twój serwer jest hostowany w regionie AWS w Londynie, działa w czasie UTC/GMT. Jeśli Twoi użytkownicy przebywają w Nowym Jorku lub Tokio, musisz uwzględnić różnice w strefach czasowych.
Czy mogę zaplanować uruchamianie zadania cron co sekundę?
Nie. Standardowy cron Uniksa jest ograniczony do rozdzielczości jednej minuty. Jeśli potrzebujesz harmonogramu poniżej minuty (np. co 10 sekund), musisz użyć osobnego narzędzia demona lub napisać skrypt, który będzie uruchamiany co minutę, ale wewnętrznie zapętli się z poleceniami uśpienia.
Co oznaczają ciągi takie jak @daily lub @hourly?
Wiele nowoczesnych implementacji cron obsługuje niestandardowe, predefiniowane makra, aby ułatwić planowanie. @daily jest dokładnie takie samo jak 0 0 * * * (każdego dnia o północy). @co godzinę jest takie samo jak 0 * * * *. Chociaż są przydatne, nie są powszechnie obsługiwane we wszystkich starszych systemach.