15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij
24.10.2024
1 +1

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 -e i przechowywane w /var/spool/cron/crontabs/ (Debian/Ubuntu) lub /var/spool/cron/ (RHEL/CentOS)
  • Systemowy crontab — plik /etc/crontab, który zawiera dodatkowe pole user dla 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ótOdpowiednikZnaczenie
@rebootUruchom raz przy starcie demona
@yearly0 0 1 1 *Raz w roku
@monthly0 0 1 * *Pierwszego dnia każdego miesiąca
@weekly0 0 * * 0Każdą niedzielę o północy
@daily0 0 * * *Każdego dnia o północy
@hourly0 * * * *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 -l

Wyś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>&1

W 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>&1
  • Czy użytkownik uruchamiający zadanie ma uprawnienia do wykonania polecenia
  • Podczas 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życiaZalecana warstwa
    Osobista automatyzacja dla jednego użytkownikaCrontab 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 harmonogramuAnacron (/etc/anacrontab)
    Zadania ze złożonymi zależnościami lub porządkowaniem usługTimery systemd
    Zadania na poziomie aplikacji wdrażane z pakietem/etc/cron.d/<package-name>
    Środowiska konteneroweSupervisor + cron lub Kubernetes CronJob

    Praktyczna lista kontrolna kluczowych wniosków

    • Uruchom crontab -l, aby przeprowadzić audyt własnych zadań; użyj wzorca pętli for, aby przeprowadzić audyt każdego użytkownika na serwerze wielodostępnym.
    • Zawsze sprawdzaj /etc/crontab, /etc/cron.d/ i systemctl list-timers --all — samo crontab -l daje 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.txt przed każdą sesją edycji.
    • Użyj flock, aby zapobiec równoczesnemu wykonywaniu długo działających zadań.
    • W systemach systemd sprawdzaj journalctl -u cron zamiast 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.

    15%

    Zaoszczędź 15% na wszystkich usługach hostingowych

    Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

    Użyj kodu:

    Skills
    Rozpocznij