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.shZarzą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.pyPraktyczne 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).sqlLog 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.confMonitoring: 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; doneCzyszczenie: 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 -deleteUWAGA: 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.timerPodsumowanie: 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>&1Kolejny odcinek: systemd timers – zobaczymy “z czym to się je”, i jakie są różnice względem cron.