Najlepsze zadanie to to, które wykonuje się samo.

– Mądrość leniwego (ale sprytnego) admina

Czym jest cron? – Twój zegar z zadaniami!

cron to demon (proces działający w tle) w Linuksie, który służy do automatycznego wykonywania poleceń lub skryptów o określonych, zaplanowanych porach. To właśnie on odpowiada za regularne uruchamianie logrotate, updatedb czy innych systemowych narzędzi.

Podstawowa składnia crontab: Mówimy czasowi, co ma robić!

Zadania dla cron definiuje się w pliku zwanym crontab (cron table). Każda linia w tym pliku to jedno zadanie. Oto jak wygląda schemat:

# Schemat pięciu gwiazdek:

# ┌──────────── minuta (0-59)

# │ ┌────────── godzina (0-23)

# │ │ ┌──────── dzień miesiąca (1-31)

# │ │ │ ┌────── miesiąc (1-12)

# │ │ │ │ ┌──── dzień tygodnia (0-6, 0 = niedziela, 7 = niedziela)

# │ │ │ │ │

# * * * * * <polecenie_do_wykonania>

Każda gwiazdka (*) oznacza “każdy możliwy”. Jeśli masz np. * * * * *, to znaczy “co minutę, każdej godziny, każdego dnia miesiąca, każdego miesiąca, każdego dnia tygodnia”.

Przydatne skróty: Dla tych, co nie lubią gwiazdek!

Jeśli nie chcesz kombinować z gwiazdkami, cron ma predefiniowane skróty dla popularnych interwałów:

@reboot   # Raz po starcie systemu

@yearly   # Raz w roku (0 0 1 1 *)

@annually # To samo co @yearly

@monthly  # Raz w miesiącu (0 0 1 * *)

@weekly   # Raz w tygodniu (0 0 * * 0)

@daily    # Raz dziennie (0 0 * * *)

@midnight # To samo co @daily

@hourly   # Co godzinę (0 * * * *)

Przykładowe wpisy crontab: Co i kiedy?

# Codziennie o 3 w nocy (minuta 0, godzina 3, każdy dzień, każdy miesiąc, każdy dzień tygodnia)

0 3 * * * /sciezka/do/backup.sh

# Co 15 minut (*/15 oznacza "co 15")

*/15 * * * * /sciezka/do/check.sh

# Każda niedziela o 2 w nocy (0 na końcu oznacza niedzielę)

0 2 * * 0 /sciezka/do/cleanup.sh

# Pierwszego dnia każdego miesiąca o północy

0 0 1 * * /sciezka/do/monthly.sh

# Co 6 godzin (o 0, 6, 12, 18)

0 */6 * * * /sciezka/do/task.sh

Zarządzanie crontab: Twój osobisty harmonogram!

Każdy użytkownik w systemie może mieć swój własny crontab.

# Edytuj `crontab` DLA BIEŻĄCEGO UŻYTKOWNIKA (otworzy plik w edytorze tekstowym, np. vim)

crontab -e

# Pokaż listę zadań `crontab` BIEŻĄCEGO UŻYTKOWNIKA

crontab -l

# Usuń WSZYSTKIE zadania `crontab` BIEŻĄCEGO UŻYTKOWNIKA (używaj ostrożnie!)

crontab -r

# Edytuj `crontab` DLA INNEGO UŻYTKOWNIKA (np. `root`)

crontab -u uzytkownik -e

Środowisko w cron: Uważaj na ścieżki!

Zadania cron uruchamiane są w minimalnym środowisku, co oznacza, że PATH (ścieżka do wyszukiwania komend) może być inna niż w Twoim interaktywnym shellu. Zawsze używaj pełnych ścieżek do poleceń lub zdefiniuj PATH na początku crontab!

# Zdefiniuj PATH na początku swojego `crontab`

PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

# Zawsze używaj pełnych ścieżek do poleceń

0 3 * * * /usr/bin/python3 /home/user/script.py

Praktyczne przykłady: cron w służbie admina!

Backup bazy danych: Nie ufaj pamięci!

# Codzienny backup bazy danych o 2 w nocy

# `$(date +\%Y\%m\%d)` tworzy nazwę pliku z datą. Znak `%` musi być escapowany ( `\%` )!

0 2 * * * /usr/bin/mysqldump -u root -pTwojeMegaTajneHaslo baza > /backup/baza_$(date +\%Y\%m\%d).sql

Log rotation: Sprzątanie logów!

# Uruchom `logrotate` codziennie o 4 w nocy, żeby skompresować i zarchiwizować stare logi

0 4 * * * /usr/sbin/logrotate /etc/logrotate.conf

Monitoring: Zawsze na posterunku!

# Sprawdź status usługi `nginx` co 5 minut i jeśli nie działa, to ją zrestartuj.

*/5 * * * * systemctl is-active nginx || systemctl restart nginx

# Alarm o zużyciu dysku: Wyślij e-mail, jeśli partycja `/dev/sda1` jest zapełniona w ponad 90%.

# To już pipeline z wyższej półki!

0 0 * * * df -h | grep '/dev/sda1' | awk '{print $5}' | cut -d'%' -f1 | \

  while read usage; do [ $usage -gt 90 ] && echo "Dysk: $usage%" | mail -s "Alert: Wysokie zużycie dysku na serwerze!" admin@domain.com; done

Czyszczenie: Po co trzymać śmieci?

# Usuń pliki tymczasowe starsze niż 7 dni z `/tmp`

0 3 * * * find /tmp -type f -mtime +7 -delete

# Wyczyść stare logi z `/var/log` starsze niż 30 dni

0 2 * * 0 find /var/log -name "*.log" -mtime +30 -delete

UWAGA: Domyślnie cron nie ma widocznego logowania. Wszystkie wyjścia ze skryptów (stdout i stderr) są przesyłane e-mailem na konto użytkownika, który uruchomił zadanie. Aby mieć pewność, że logujesz wyniki, przekierowuj wyjście do pliku, np.: » /var/log/moje_zadanie.log 2>&1.

cron vs systemd timers: Kto tu jest nowym szeryfem?

W nowszych systemach Linuksa (szczególnie tych opartych na systemd), systemd timers oferują bardziej zaawansowaną i elastyczną alternatywę dla cron. Pozwalają na definiowanie zadań z większą precyzją, zależnościami, a nawet obsługą stref czasowych.

# Pokaż listę wszystkich aktywnych timerów `systemd`

systemctl list-timers

# Pokaż status konkretnego timera (np. `backup.timer`)

systemctl status backup.timer

Podsumowanie: Programuj swój czas!

cron to potężne, proste i niezawodne narzędzie do automatyzacji. Opanowanie go to podstawa efektywnej administracji Linuksem.

Kluczowe punkty do zapamiętania:

  • cron to demon, który uruchamia zadania według harmonogramu.
  • Używaj crontab -e do edycji i crontab -l do wyświetlania swoich zadań.
  • Zawsze używaj pełnych ścieżek do poleceń w skryptach cron.
  • Pamiętaj o przekierowaniu wyjścia, jeśli chcesz logować wyniki zadań.
  • Dla nowszych systemów, systemd timers to bardziej zaawansowana alternatywa.
# Twój nowy zestaw do sprawdzenia swoich automatycznych zadań:

crontab -l
# I dodaj swoje pierwsze zadanie: 0 3 * * * /sciezka/do/zadania.sh >> /var/log/zadania.log 2>&1

Kolejny odcinek: systemd timers – zobaczymy “z czym to się je”, i jakie są różnice względem cron.