Каждый админ хотя бы раз слышал: Cron не отработал.
Но, спойлер: в 90% случаев cron работает. Не работает: окружение, путь или логика скрипта.
1️⃣ Неправильный PATH. Cron запускается с минимальным окружением. То, что работает в shell:
myscript.sh
В cron может не найти:
command not foundПроверка:
echo $PATH
Решение:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Или использовать абсолютные пути:
/usr/bin/rsync
/usr/bin/docker
2️⃣ Не тот пользователь. Есть:
crontab -e
И есть:
sudo crontab -e
Это два разных crontab.
Проверка:
crontab -l
sudo crontab -l
Иногда задача просто стоит не там.
3️⃣ Нет прав на файл. Скрипт есть. Но:
chmod +x script.sh
забыли. Или владелец не тот.
4️⃣ Неправильный shebang. Если в начале:
#!/bin/bash
А на системе bash лежит в:
/usr/bin/bash
Cron молча свалится. Проверка:
which bash
Лучший вариант:
#!/usr/bin/env bash
5️⃣ Нет логирования и кажется, не сработал Если вывод не перенаправлен, ты его не увидишь. Правильно:
0 3 * * * /path/script.sh >> /var/log/script.log 2>&1
Без этого ты гадаешь.
6️⃣ Разница окружения. Cron не знает:
твоих alias
твоих переменных
твоего virtualenv
твоего nvm
Если работает вручную, но не в cron - почти всегда проблема в ENV.
Debug-метод:
env > /tmp/cron_env.txt
7️⃣ Скрипт падает внутри. Cron сработал. Но внутри:
rm -rf "$DIR"
где
$DIR пустой.Без:
set -euo pipefail
ошибка могла остаться незамеченной.
8️⃣ Cron вообще не запущен. Редко, но бывает. Проверка:
systemctl status cron
# или
systemctl status crond
BashTex 📱 #cron