So sieht die Meldung aus
CRON[2418]: (root) CMD (/usr/local/bin/job.sh)
/usr/local/bin/job.sh: 3: mysqldump: not foundHäufige Ursachen
- Cron hat einen anderen
PATHals deine Shell und liest keine.bashrc. - Das Skript nutzt relative Pfade und läuft deshalb nicht im erwarteten Verzeichnis.
- Ausführungsrecht fehlt oder der Shebang zeigt auf einen nicht vorhandenen Interpreter.
- Der Eintrag steht in der crontab des falschen Benutzers oder in
/etc/cron.dohne Benutzerspalte. - Cron selbst läuft nicht, oder ein Syntaxfehler verhindert das Laden der Datei.
Prüfen
- Cron-Dienst und letzte Ausführung
systemctl status cron --no-pager | head -n 5; journalctl -u cron --since '1 hour ago' --no-pager | tail -n 20 - Einträge des aktuellen Benutzers
crontab -l - Rechte und Shebang des Skripts
ls -l /usr/local/bin/job.sh; head -n 1 /usr/local/bin/job.sh - Mit leerer Umgebung testen, wie cron sie hat
env -i /bin/sh -c '/usr/local/bin/job.sh'
Lösung
- Im Skript absolute Pfade verwenden und
PATHam Anfang setzen:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin. - Ausgaben in eine Logdatei umleiten:
>> /var/log/job.log 2>&1. Sonst siehst du Fehler nie. - Shebang prüfen (
#!/bin/bash) und mitchmod +xdas Ausführungsrecht setzen. - Bei
/etc/cron.ddie Benutzerspalte nicht vergessen, sonst wird die Zeile ignoriert. - Mit
env -itesten, damit du dieselbe Umgebung wie cron hast.
Häufige Fragen
Warum funktioniert es manuell, aber nicht per cron?
Weil cron ohne deine Shell-Umgebung startet: anderer PATH, kein Home-Verzeichnis, keine Aliase.
Wo landen die Ausgaben?
Cron mailt sie an den lokalen Benutzer. Ohne Mailserver verschwinden sie, deshalb immer in eine Datei loggen.