# Opis polecenia crontab

Demon cron (crond) to usługa działająca w tle w systemach operacyjnych typu Unix, która wykonuje zaplanowane polecenia. Odczytuje konfigurację z plików crontab (tabeli cron), które określają kiedy i jak często każde polecenie powinno być uruchamiane.

## Składnia

Polecenie crontab zarządza plikami crontab poszczególnych użytkowników:

```
crontab [-u user] [-l | -r | -e | -i] [file]
```

## Opcje

- **`-e`**: Edytuj crontab bieżącego użytkownika w domyślnym edytorze ($VISUAL lub $EDITOR). Nowy crontab zostanie zainstalowany po zamknięciu edytora.
- **`-l`**: Wyświetl crontab bieżącego użytkownika na standardowe wyjście.
- **`-r`**: Całkowicie usuń crontab bieżącego użytkownika.
- **`-i`**: Poproś o potwierdzenie przed usunięciem (używane z -r).
- **`-u user`**: Operuj na crontabie wskazanego użytkownika zamiast własnego. Wymaga uprawnień root.
- **`file`**: Zainstaluj crontab z podanego pliku. Użyj - dla standardowego wejścia.

## Format pliku crontab

Każda linia w pliku crontab to albo przypisanie zmiennej środowiskowej, komentarz (zaczynający się od #), albo zadanie cron w następującym formacie:

```
┌───────────── minuta (0–59)
│ ┌───────────── godzina (0–23)
│ │ ┌───────────── dzień miesiąca (1–31)
│ │ │ ┌───────────── miesiąc (1–12 lub JAN–DEC)
│ │ │ │ ┌───────────── dzień tygodnia (0–6 lub SUN–SAT)
│ │ │ │ │
* * * * *  polecenie do wykonania
```

## Operatory pól

- *** (asterisk)**: Dopasowuje każdą możliwą wartość pola.
- **, (comma)**: Określa listę wartości. Przykład: 1,15 w polu dnia miesiąca oznacza 1. i 15. dzień.
- **- (hyphen)**: Definiuje zakres włącznie. Przykład: 9-17 w polu godziny oznacza każdą godzinę od 9 do 17.
- **/ (slash)**: Definiuje krok. Przykład: */10 w polu minuty oznacza co 10 minut. Można łączyć z zakresem: 1-30/5.

## Specjalne ciągi

Zamiast pięciu pól czasowych można użyć jednego z następujących skrótów:

| String | Equivalent |
|--------|-----------|
| `@yearly` / `@annually` | `0 0 1 1 *` |
| `@monthly` | `0 0 1 * *` |
| `@weekly` | `0 0 * * 0` |
| `@daily` / `@midnight` | `0 0 * * *` |
| `@hourly` | `0 * * * *` |
| `@reboot` | `Run once at startup` |

## Zmienne środowiskowe

Na początku pliku crontab można ustawić zmienne środowiskowe. Najczęściej używane to:

- **SHELL**: Powłoka używana do uruchamiania poleceń (domyślnie: /bin/sh).
- **PATH**: Ścieżka wyszukiwania poleceń. Domyślny PATH w cron jest minimalny (zwykle /usr/bin:/bin), więc zawsze używaj ścieżek bezwzględnych lub ustaw PATH jawnie.
- **MAILTO**: Gdzie wysyłać wyjście poleceń. Ustaw na "" aby wyłączyć e-mail. Domyślnie wyjście jest wysyłane do właściciela crontab.
- **CRON_TZ**: Ustaw strefę czasową dla crontab (nie obsługiwane we wszystkich systemach). Bez tego cron używa strefy czasowej systemu.

```
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com

*/5 * * * * /home/user/scripts/backup.sh
```

## Systemowy crontab vs. crontab użytkownika

Crontaby użytkowników (edytowane za pomocą crontab -e) mają pięć pól czasowych i polecenie. Systemowy crontab (/etc/crontab) i pliki w /etc/cron.d/ mają dodatkowe pole między polami czasowymi a poleceniem: nazwę użytkownika, jako który polecenie jest uruchamiane.

Przykład systemowego crontab:

```
# /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m  h  dom mon dow user    command
*/15 *  *   *   *   root    /usr/local/bin/system-check.sh
0    2  *   *   *   backup  /usr/local/bin/nightly-backup.sh
```

## Typowe pułapki

### % (percent sign)

Znak procentu (%) ma specjalne znaczenie w crontab: jest zamieniany na nową linię, a wszystko po pierwszym % jest wysyłane jako standardowe wejście do polecenia. Aby użyć dosłownego %, zapisz go jako \%.

```
# Wrong — the % will be interpreted
0 0 * * * echo "Date: $(date +%Y-%m-%d)"

# Correct — escape the %
0 0 * * * echo "Date: $(date +\%Y-\%m-\%d)"
```

### PATH

Cron działa z minimalnym PATH. Skrypty zależne od poleceń w /usr/local/bin lub innych katalogach powinny używać ścieżek bezwzględnych lub ustawić PATH na początku crontab.

### Day-of-month + day-of-week

Gdy zarówno dzień miesiąca, jak i dzień tygodnia są ograniczone (nie *), cron uruchamia polecenie, gdy którekolwiek pole pasuje (logika OR), a nie gdy oba pasują. Na przykład 0 0 1 * 5 uruchamia się o północy 1. każdego miesiąca ORAZ w każdy piątek.

### Timezone

Cron domyślnie używa strefy czasowej systemu. Jeśli serwer jest w UTC, ale chcesz uruchamiać zadania w lokalnej strefie czasowej, użyj CRON_TZ (gdzie obsługiwane) lub ręcznie przelicz czasy.

### Output and logging

Domyślnie cron wysyła całe wyjście (stdout i stderr) do właściciela crontab. Aby wyciszyć zadanie, przekieruj wyjście: command > /dev/null 2>&1. Aby logować wyjście, przekieruj do pliku: command >> /var/log/myjob.log 2>&1.

```
# Discard all output
*/5 * * * * /path/to/script.sh > /dev/null 2>&1

# Log output to a file
*/5 * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1
```

## Praktyczne przykłady

- [`*/5 * * * *`](https://crontab.run/pl/every-5-minutes) — run every 5 minutes
- [`0 0 * * *`](https://crontab.run/pl/daily) — run once a day at midnight
- [`0 9 * * 1-5`](https://crontab.run/pl/every-weekday-at-9am) — run at 9 AM on weekdays
- [`0 0 1 * *`](https://crontab.run/pl/every-month) — run at midnight on the 1st of every month
- [`0 0 * * 0`](https://crontab.run/pl/every-sunday) — run at midnight every Sunday

Canonical: https://crontab.run/pl/command

---

Maintained by Jsmon — https://jsmon.sh
