# Erklärung des crontab-Befehls

Der Cron-Daemon (crond) ist ein Hintergrunddienst auf Unix-Betriebssystemen, der geplante Befehle ausführt. Er liest die Konfiguration aus Crontab-Dateien (Cron-Tabellen), die festlegen, wann und wie oft jeder Befehl ausgeführt werden soll.

## Syntax

Der crontab-Befehl verwaltet die Crontab-Dateien jedes Benutzers:

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

## Optionen

- **`-e`**: Bearbeitet den Crontab des aktuellen Benutzers im Standard-Editor ($VISUAL oder $EDITOR). Der neue Crontab wird nach dem Schließen des Editors installiert.
- **`-l`**: Zeigt den Crontab des aktuellen Benutzers auf der Standardausgabe an.
- **`-r`**: Entfernt den Crontab des aktuellen Benutzers vollständig.
- **`-i`**: Fordert vor dem Entfernen eine Bestätigung an (verwendet mit -r).
- **`-u user`**: Arbeitet mit dem Crontab des angegebenen Benutzers statt dem eigenen. Erfordert Root-Rechte.
- **`file`**: Installiert den Crontab aus der angegebenen Datei. Verwenden Sie - für die Standardeingabe.

## Crontab-Dateiformat

Jede Zeile in einer Crontab-Datei ist entweder eine Umgebungsvariablen-Zuweisung, ein Kommentar (beginnend mit #) oder ein Cron-Job mit diesem Format:

```
┌───────────── Minute (0–59)
│ ┌───────────── Stunde (0–23)
│ │ ┌───────────── Tag des Monats (1–31)
│ │ │ ┌───────────── Monat (1–12 oder JAN–DEC)
│ │ │ │ ┌───────────── Wochentag (0–6 oder SUN–SAT)
│ │ │ │ │
* * * * *  auszuführender Befehl
```

## Feldoperatoren

- *** (asterisk)**: Entspricht jedem möglichen Wert des Feldes.
- **, (comma)**: Gibt eine Liste von Werten an. Beispiel: 1,15 im Feld Tag des Monats bedeutet den 1. und 15.
- **- (hyphen)**: Definiert einen inklusiven Bereich. Beispiel: 9-17 im Stundenfeld bedeutet jede Stunde von 9 bis 17.
- **/ (slash)**: Definiert einen Schritt. Beispiel: */10 im Minutenfeld bedeutet alle 10 Minuten. Kann mit einem Bereich kombiniert werden: 1-30/5.

## Spezielle Zeichenketten

Anstelle der fünf Zeitfelder können Sie eine dieser Kurzformen verwenden:

| 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` |

## Umgebungsvariablen

Am Anfang einer Crontab-Datei können Umgebungsvariablen gesetzt werden. Die gebräuchlichsten sind:

- **SHELL**: Die Shell, die zum Ausführen von Befehlen verwendet wird (Standard: /bin/sh).
- **PATH**: Der Suchpfad für Befehle. Der Standard-PATH von Cron ist minimal (normalerweise /usr/bin:/bin), verwenden Sie daher immer absolute Pfade oder setzen Sie PATH explizit.
- **MAILTO**: Wohin die Befehlsausgabe gesendet wird. Auf "" setzen, um E-Mails zu unterdrücken. Standardmäßig wird die Ausgabe an den Crontab-Besitzer gesendet.
- **CRON_TZ**: Setzt die Zeitzone für den Crontab (nicht auf allen Systemen unterstützt). Ohne diese Einstellung verwendet Cron die Systemzeitzone.

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

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

## System-Crontab vs. Benutzer-Crontab

Benutzer-Crontabs (bearbeitet mit crontab -e) haben fünf Zeitfelder plus den Befehl. Der System-Crontab (/etc/crontab) und Dateien in /etc/cron.d/ haben ein zusätzliches Feld zwischen den Zeitfeldern und dem Befehl: den Benutzernamen, unter dem der Befehl ausgeführt wird.

Beispiel eines System-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
```

## Häufige Fallstricke

### % (percent sign)

Das Prozentzeichen (%) hat in Crontab eine besondere Bedeutung: Es wird in einen Zeilenumbruch umgewandelt, und alles nach dem ersten % wird als Standardeingabe an den Befehl gesendet. Um ein literales % zu verwenden, maskieren Sie es mit \%.

```
# 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 wird mit einem minimalen PATH ausgeführt. Skripte, die auf Befehle in /usr/local/bin oder anderen Verzeichnissen angewiesen sind, sollten absolute Pfade verwenden oder PATH am Anfang des Crontab setzen.

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

Wenn sowohl Tag des Monats als auch Wochentag eingeschränkt sind (nicht *), führt Cron den Befehl aus, wenn eines der Felder zutrifft (ODER-Logik), nicht wenn beide zutreffen. Beispiel: 0 0 1 * 5 wird um Mitternacht am 1. jedes Monats UND jeden Freitag ausgeführt.

### Timezone

Cron verwendet standardmäßig die Systemzeitzone. Wenn Ihr Server in UTC ist, Sie aber Jobs in einer lokalen Zeitzone ausführen möchten, verwenden Sie CRON_TZ (wo unterstützt) oder rechnen Sie die Zeiten manuell um.

### Output and logging

Standardmäßig sendet Cron jede Ausgabe (stdout und stderr) an den Crontab-Besitzer. Um einen Job stumm zu schalten, leiten Sie die Ausgabe um: command > /dev/null 2>&1. Um die Ausgabe zu protokollieren, leiten Sie in eine Datei um: 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
```

## Praktische Beispiele

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

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

---

Maintained by Jsmon — https://jsmon.sh
