Jak wyświetlić i wylistować zadania Cron za pomocą Crontab
Polecenie crontab jest głównym interfejsem do przeglądania, edytowania i zarządzania zaplanowanymi zadaniami w systemie Unix cron. Aby wyświetlić wszystkie zadania cron dla aktualnie zalogowanego użytkownika, uruchom crontab -l w dowolnym terminalu. W przypadku zadań root lub systemowych, sprawdź bezpośrednio /etc/crontab, /etc/cron.d/ i /var/spool/cron/crontabs/.
Cron jest podstawą automatyzacji zadań w systemach Linux i Unix. Niezależnie od tego, czy wykonujesz nocne zrzuty baz danych w środowisku VPS Hosting, rotujesz logi na Serwerze Dedykowanym, czy automatycznie odnawiasz Certyfikaty SSL za pomocą Certbot, zrozumienie sposobu audytowania i wyświetlania wszystkich zaplanowanych zadań na maszynie jest niezbędną umiejętnością administratora systemu. Ten przewodnik obejmuje każdą warstwę stosu cron — crontaby użytkowników, systemowe crontaby, katalogi drop-in i spool — wraz z rzeczywistymi pułapkami, które sprawiają problemy nawet doświadczonym inżynierom.
Czym jest Crontab i jak działa system Cron
Crontab (skrót od „cron table”) to plik konfiguracyjny dla każdego użytkownika, który instruuje demona crond, jakie polecenia wykonywać i kiedy. Każde konto użytkownika w systemie — w tym root — może posiadać niezależny crontab. Demon odczytuje te pliki przy uruchomieniu i po każdej edycji, a następnie uruchamia zadania zgodnie z ich specyfikacjami czasowymi.
Ekosystem cron w nowoczesnej dystrybucji Linux składa się z kilku odrębnych warstw:
- Crontaby użytkowników — zarządzane przez
crontab -ei przechowywane w/var/spool/cron/crontabs/(Debian/Ubuntu) lub/var/spool/cron/(RHEL/CentOS) - Systemowy crontab — plik
/etc/crontab, który zawiera dodatkowe poleuserdla każdego wpisu - Katalog drop-in —
/etc/cron.d/, gdzie pakiety instalują własne definicje zadań - Katalogi run-parts —
/etc/cron.hourly/,/etc/cron.daily/,/etc/cron.weekly/,/etc/cron.monthly/, które zawierają wykonywalne skrypty zamiast plików w składni crontab - Anacron — uzupełnienie crona obsługujące zadania na maszynach, które nie działają 24/7, odczytując z
/etc/anacrontab
Zrozumienie, w której warstwie znajduje się dane zadanie, jest kluczowe podczas audytu serwera, ponieważ samo crontab -l pominie większość zaplanowanych zadań w typowym systemie produkcyjnym.
Składnia pól czasu w Crontab
Każdy wpis crontab zawiera stałą pięciopolową specyfikację czasu przed poleceniem:
* * * * * command_to_execute
| | | | |
| | | | +----- day of the week (0–7, Sunday = 0 or 7)
| | | +------- month (1–12)
| | +--------- day of the month (1–31)
| +----------- hour (0–23)
+------------- minute (0–59)Skróty specjalnej składni obsługiwane przez większość implementacji cron:
| Skrót | Odpowiednik | Znaczenie |
|---|---|---|
@reboot | — | Uruchom raz przy starcie demona |
@yearly | 0 0 1 1 * | Raz w roku |
@monthly | 0 0 1 * * | Pierwszego dnia każdego miesiąca |
@weekly | 0 0 * * 0 | Każdą niedzielę o północy |
@daily | 0 0 * * * | Każdego dnia o północy |
@hourly | 0 * * * * | Na początku każdej godziny |
Pliki /etc/crontab i /etc/cron.d/ dodają szóste pole — nazwę użytkownika, pod którym uruchamiane jest polecenie — między specyfikacją czasu a samym poleceniem.
Jak wyświetlić zadania Cron: wszystkie metody wyjaśnione
1. Przeglądanie własnych zadań Cron użytkownika
crontab -lWyświetla crontab użytkownika wykonującego polecenie. Jeśli crontab jeszcze nie istnieje, zobaczysz puste wyjście lub komunikat no crontab for <username> — oba są normalne.
Przykładowe wyjście:
# m h dom mon dow command
0 0 * * * /home/deploy/backup.sh
30 2 * * 7 /home/deploy/scripts/cleanup.sh
15 */4 * * * /usr/local/bin/health-check.sh >> /var/log/health.log 2>&1W tym przykładzie:
backup.sh uruchamia się każdego dnia o północy
cleanup.sh uruchamia się każdą niedzielę o 02:30
health-check.sh uruchamia się co cztery godziny począwszy od 00:15, z przekierowaniem stdout i stderr do pliku dziennika
Pułapka: Przekierowanie wyjścia (>>, 2>&1) jest często pomijane we wpisach crontab. Bez niego cron próbuje wysłać wyjście e-mailem do lokalnego użytkownika przez sendmail. Na serwerach bez agenta transferu poczty powoduje to ciche odrzucanie wszystkich danych wyjściowych i sprawia, że debugowanie jest prawie niemożliwe. Zawsze przekierowuj wyjście lub ustaw MAILTO="" na początku crontab.
2. Wyświetlanie zadań Cron innego użytkownika
Mając uprawnienia sudo lub dostęp root, możesz sprawdzić crontab dowolnego użytkownika:
sudo crontab -l -u john
Zastąp john nazwą docelowego użytkownika. Jest to funkcjonalnie identyczne z odczytaniem surowego pliku spool, ale używa właściwego mechanizmu blokowania, więc zawsze jest preferowane nad bezpośrednim dostępem do pliku.
3. Wyświetlanie wszystkich crontabów użytkowników naraz
Na serwerze wieloużytkownikowym iterowanie po każdym koncie jest jedynym niezawodnym sposobem uzyskania pełnego obrazu:
for user in $(cut -f1 -d: /etc/passwd); do
echo "=== Crontab for: $user ==="
sudo crontab -l -u "$user" 2>/dev/null
done
Opcja 2>/dev/null wycisza komunikaty „no crontab for” dla użytkowników, którzy nie mają crontaba, utrzymując czyste wyjście.
4. Przeglądanie systemowego Crontab
cat /etc/crontab
Typowe wyjście w systemie opartym na Debianie:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
Zwróć uwagę na zabezpieczenie test -x /usr/sbin/anacron: jeśli anacron jest zainstalowany, te wywołania run-parts są pomijane, a anacron przejmuje odpowiedzialność za zadania dzienne, tygodniowe i miesięczne. Jest to częste źródło zamieszania, gdy zadania wydają się nie uruchamiać zgodnie z harmonogramem.
5. Wyświetlanie zadań w /etc/cron.d/
ls -la /etc/cron.d/
Aby sprawdzić zawartość każdego pliku w katalogu w jednym przebiegu:
grep -v '^#|^$' /etc/cron.d/*
Usuwa to linie komentarzy i puste linie, pokazując tylko aktywne definicje zadań. Menedżery pakietów często umieszczają tu pliki — typowe przykłady to sysstat, nadpisania logrotate i agenci monitorowania.
6. Bezpośrednie sprawdzanie katalogu spool Cron
ls -la /var/spool/cron/crontabs/
W systemach RHEL, CentOS i Fedora ścieżka to /var/spool/cron/ bez podkatalogu crontabs. Aby odczytać surowy plik spool konkretnego użytkownika:
sudo cat /var/spool/cron/crontabs/username
Ważne: Nigdy nie edytuj plików spool bezpośrednio edytorem tekstu. Polecenie crontab -e używa blokowania plików i weryfikuje składnię przed zainstalowaniem nowego pliku. Bezpośrednie edycje mogą uszkodzić plik lub pozostawić go w stanie, w którym crond całkowicie go ignoruje.
7. Wyświetlanie zadań Anacron
Jeśli system używa anacron do odpornego planowania:
cat /etc/anacrontab
Wpisy Anacron używają innej składni — okres w dniach, opóźnienie w minutach, identyfikator zadania i polecenie — zamiast standardowego pięciopolowego formatu cron.
8. Sprawdzanie timerów Systemd (nowoczesna alternatywa)
W dystrybucjach opartych na systemd wiele zadań, które historycznie były zarządzane przez cron, jest teraz obsługiwanych przez timery systemd. Nie pojawią się one w żadnym listingu crontab:
systemctl list-timers --all
Kompletny audyt serwera musi obejmować zarówno sprawdzenie cron, jak i timerów systemd. Pominięcie tego jest jedną z najczęstszych luk w przeglądach bezpieczeństwa i zgodności.
Kompletny audyt Cron: jednorazowe polecenie
Aby szybko i kompleksowo przeprowadzić audyt wszystkich zaplanowanych zadań w systemie, połącz wszystkie źródła:
echo "=== /etc/crontab ===" && cat /etc/crontab
echo "=== /etc/cron.d/ ===" && ls /etc/cron.d/ && grep -rh '' /etc/cron.d/
echo "=== User crontabs ===" && for u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null && echo " ^ user: $u"; done
echo "=== Systemd timers ===" && systemctl list-timers --all --no-pager
Edytowanie i zarządzanie zadaniami Cron
Aby otworzyć własny crontab w domyślnym edytorze systemu ($VISUAL lub $EDITOR, z powrotem do vi):
crontab -e
Aby edytować crontab innego użytkownika jako root:
sudo crontab -e -u username
Aby usunąć wszystkie zadania cron dla bieżącego użytkownika (używaj ostrożnie — jest to nieodwracalne bez kopii zapasowej):
crontab -r
Aby wykonać kopię zapasową crontab przed wprowadzeniem zmian:
crontab -l > ~/crontab_backup_$(date +%F).txt
Zawsze twórz kopię zapasową przed edycją. W crontab -e nie ma wbudowanej funkcji cofania.
Cron vs. timery Systemd: porównanie funkcji
Funkcja
Cron
Timery Systemd
Format konfiguracji
Zwykły tekst, składnia pięciopolowa
Pliki jednostek (.timer + .service)
Planowanie dla użytkownika
Tak, przez crontaby użytkowników
Tak, przez instancje systemd na poziomie użytkownika
Obsługa pominiętych zadań
Nie (zadanie jest pomijane, jeśli system jest wyłączony)
Tak, z Persistent=true
Logowanie
Syslog / poczta
Journald (z możliwością zapytań przez journalctl)
Zarządzanie zależnościami
Brak
Pełny graf zależności systemd
Losowe opóźnienie
Nie natywnie (wymaga sleep $RANDOM)
RandomizedDelaySec=
Złożoność
Niska
Umiarkowana
Dostępność
Wszystkie systemy Unix/Linux
Tylko Linux oparty na systemd
W przypadku prostej automatyzacji opartej na czasie w dowolnym systemie Unix — w tym w środowiskach legacy i kontenerach — cron pozostaje najbardziej przenośnym i operacyjnie prostym wyborem. Timery systemd są lepsze, gdy potrzebujesz porządkowania zależności, niezawodnego wykonywania pominiętych zadań lub ustrukturyzowanego wyjścia dziennika.
Typowe polecenia wyświetlania Crontab: krótki przewodnik
Cel
Polecenie
Wyświetl zadania bieżącego użytkownika
crontab -l
Wyświetl zadania innego użytkownika
sudo crontab -l -u username
Wyświetl zadania wszystkich użytkowników
for u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null; done
Wyświetl systemowy crontab
cat /etc/crontab
Wyświetl zadania cron.d
ls /etc/cron.d/
Wyświetl katalog spool
ls /var/spool/cron/crontabs/
Wyświetl zadania anacron
cat /etc/anacrontab
Wyświetl timery systemd
systemctl list-timers --all
Edytuj crontab bieżącego użytkownika
crontab -e
Usuń crontab bieżącego użytkownika
crontab -r
Rzeczywiste pułapki i przypadki brzegowe
Zmienne środowiskowe nie są dziedziczone. Cron uruchamia zadania w minimalnym środowisku powłoki. Zmienne takie jak PATH, HOME i LANG, ustawione w .bashrc lub .profile, nie są dostępne. Zawsze używaj bezwzględnych ścieżek dla poleceń i plików binarnych lub jawnie zdefiniuj PATH na początku crontab.
Zmienna MAILTO kontroluje routing wyjścia. Ustaw MAILTO="", aby odrzucić wyjście, lub MAILTO="admin@example.com", aby przekierować je na określony adres. Bez skonfigurowanego MTA nieobsługiwane wyjście powoduje ciche awarie.
Uprawnienia do skryptów mają znaczenie. Skrypt, który działa poprawnie interaktywnie, może zawieść pod cronem, jeśli nie jest wykonywalny (chmod +x) lub jeśli odwołuje się do plików, których użytkownik cron nie może odczytać.
Nakładające się wykonywanie zadań. Jeśli zadanie trwa dłużej niż jego interwał, wiele instancji będzie działać jednocześnie. Użyj pliku blokady lub flock, aby temu zapobiec:
0 * * * * /usr/bin/flock -n /tmp/myjob.lock /home/user/long-running-job.sh
Świadomość strefy czasowej. Cron domyślnie używa systemowej strefy czasowej. Na serwerach z UTC ustawionym jako zegar systemowy — co jest standardową praktyką na VPS Hosting i Serwerach Dedykowanych — upewnij się, że zaplanowane czasy uwzględniają przesunięcie. Niektóre implementacje cron obsługują zmienną CRON_TZ dla każdego crontab.
Walidacja składni Crontab. Przed wdrożeniem nowego wpisu crontab w środowisku produkcyjnym zweryfikuj wyrażenie za pomocą narzędzia takiego jak crontab.guru, aby potwierdzić, że harmonogram odpowiada Twoim zamierzeniom.
Logowanie i debugowanie zadań Cron
Domyślnie cron rejestruje wykonanie zadań w syslog. Aby wyświetlić ostatnią aktywność cron:
grep CRON /var/log/syslog | tail -50
W systemach opartych na systemd:
journalctl -u cron --since "1 hour ago"
Jeśli zadanie nie jest uruchamiane, sprawdź:
Czy demon cron jest aktywny: systemctl status cron (lub crond w systemach opartych na RHEL)
Czy skrypt jest wykonywalny i ścieżka jest poprawna
Czy pola czasu są składniowo poprawne
Czy wyjście nie jest cicho odrzucane — tymczasowo dodaj >> /tmp/job.log 2>&1Podczas zarządzania złożonymi stosami automatyzacji na VPS z cPanel, cPanel udostępnia graficzny interfejs Cron Jobs w sekcji Zaawansowane, który zapisuje bezpośrednio do crontab użytkownika. Zadania dodane przez cPanel są w pełni widoczne za pomocą crontab -l i zachowują się identycznie jak wpisy dodane ręcznie.
Macierz decyzyjna: której warstwy Cron użyć
| Przypadek użycia | Zalecana warstwa |
|---|---|
| Osobista automatyzacja dla jednego użytkownika | Crontab użytkownika (crontab -e) |
| Zadania konserwacji systemu (kopie zapasowe, rotacja logów) | /etc/cron.d/ lub /etc/crontab |
| Skrypty, które muszą działać nawet po pominięciu harmonogramu | Anacron (/etc/anacrontab) |
| Zadania ze złożonymi zależnościami lub porządkowaniem usług | Timery systemd |
| Zadania na poziomie aplikacji wdrażane z pakietem | /etc/cron.d/<package-name> |
| Środowiska kontenerowe | Supervisor + cron lub Kubernetes CronJob |
Praktyczna lista kontrolna kluczowych wniosków
- Uruchom
crontab -l, aby przeprowadzić audyt własnych zadań; użyj wzorca pętlifor, aby przeprowadzić audyt każdego użytkownika na serwerze wielodostępnym. - Zawsze sprawdzaj
/etc/crontab,/etc/cron.d/isystemctl list-timers --all— samocrontab -ldaje niepełny obraz. - Używaj bezwzględnych ścieżek dla wszystkich poleceń i plików binarnych wewnątrz wpisów crontab.
- Ustaw
MAILTO=""lub jawnie przekieruj wyjście, aby zapobiec cichym awariom na serwerach bez MTA. - Wykonaj kopię zapasową crontab za pomocą
crontab -l > backup.txtprzed każdą sesją edycji. - Użyj
flock, aby zapobiec równoczesnemu wykonywaniu długo działających zadań. - W systemach systemd sprawdzaj
journalctl -u cronzamiast polegać wyłącznie na/var/log/syslog. - Weryfikuj nowe wyrażenia czasowe za pomocą internetowego testera wyrażeń cron przed wdrożeniem do środowiska produkcyjnego.
- Uwzględnij UTC vs. lokalną strefę czasową na instancjach chmurowych i VPS Hosting.
- W przypadku serwerów Email Hosting lub dowolnej infrastruktury, gdzie zadania są krytyczne, wdrożyj zewnętrzny monitoring (np. pingi healthcheck), aby wykrywać ciche awarie cron.
FAQ
Jak wyświetlić wszystkie zadania cron dla każdego użytkownika na serwerze Linux?
Iteruj po /etc/passwd i wywołaj sudo crontab -l -u <user> dla każdego konta, wyciszając błędy „no crontab” za pomocą 2>/dev/null. Dodatkowo sprawdź /etc/crontab, /etc/cron.d/ i uruchom systemctl list-timers --all, aby przechwycić zadania na poziomie systemu i zarządzane przez systemd.
Dlaczego crontab -l nie pokazuje nic, mimo że zadania są uruchomione?
Zadania są prawdopodobnie zdefiniowane w /etc/crontab, pliku wewnątrz /etc/cron.d/ lub jako timery systemd — żadne z nich nie są widoczne przez crontab -l. To polecenie pokazuje tylko osobisty crontab wywołującego użytkownika przechowywany w katalogu spool.
Jaka jest różnica między /etc/crontab a /etc/cron.d/?
Oba używają tej samej sześciopolowej składni (w tym pola nazwy użytkownika) i są odczytywane przez systemowego demona cron. /etc/crontab to pojedynczy monolityczny plik przeznaczony do ręcznej administracji systemem. /etc/cron.d/ to katalog drop-in, gdzie poszczególne pakiety lub usługi instalują własne pliki zadań, utrzymując je w izolacji i ułatwiając zarządzanie lub niezależne usuwanie.
Jak zapobiec uruchamianiu wielu nakładających się instancji zadania cron?
Opakuj polecenie w flock -n /tmp/lockfile.lock, aby uzyskać nieblokującą wyłączną blokadę. Jeśli poprzednia instancja nadal działa, nowe wywołanie natychmiast kończy działanie bez wykonania polecenia, zapobiegając rywalizacji o zasoby i uszkodzeniu danych.
Gdzie są przechowywane logi zadań cron i jak debugować zadanie, które się nie wykonuje?
W większości systemów cron rejestruje do /var/log/syslog (filtruj za pomocą grep CRON) lub przez journald (journalctl -u cron). Podczas debugowania tymczasowo dołącz >> /tmp/debug.log 2>&1 do polecenia zadania, aby przechwycić wszystkie wyjścia, sprawdź czy skrypt jest wykonywalny, potwierdź że demon działa za pomocą systemctl status cron i niezależnie zweryfikuj wyrażenie czasowe.
