linux scripting

crontab

Управление таблицей расписания cron — просмотр, редактирование и удаление задач пользователя

Описание

crontab (cron table) — утилита для управления пользовательскими таблицами расписания демона cron. Каждый пользователь системы может иметь собственный crontab-файл, хранящийся в /var/spool/cron/crontabs/USERNAME. Доступ к этому файлу осуществляется исключительно через команду crontab — прямое редактирование файла в /var/spool/cron/ не рекомендуется, так как демон может не заметить изменений.

Команда crontab -e открывает файл расписания в редакторе (определяется переменной VISUAL или EDITOR, либо запрашивается при первом запуске). После сохранения демон cron автоматически перечитывает обновлённое расписание. Команда crontab -l показывает текущее расписание, crontab -r — удаляет его целиком.

Системный администратор может управлять доступом к crontab через файлы /etc/cron.allow и /etc/cron.deny: если существует /etc/cron.allow, только перечисленные в нём пользователи могут использовать crontab; если существует только /etc/cron.deny, все пользователи кроме перечисленных имеют доступ.

Синтаксис

crontab [-u USER] -e # редактировать crontab (создать если нет) crontab [-u USER] -l # показать текущий crontab crontab [-u USER] -r # удалить crontab пользователя crontab [-u USER] -i -r # удалить с подтверждением crontab [-u USER] FILE # загрузить crontab из файла (заменяет существующий) crontab [-u USER] - # загрузить crontab из stdin

Формат строки crontab

# Комментарий начинается с # # Переменные окружения SHELL=/bin/bash MAILTO=user@example.com # Строка задачи: MIN HOUR DOM MON DOW COMMAND # MIN - минуты 0-59 # HOUR - часы 0-23 # DOM - день месяца 1-31 # MON - месяц 1-12 (или jan,feb,...dec) # DOW - день недели 0-7 (0 и 7 = воскресенье, или sun,mon,...sat) # COMMAND - команда или скрипт для выполнения * * * * * /usr/bin/command 30 2 * * * /home/user/backup.sh 0 9-17 * * 1-5 /home/user/check.sh

Флаги и опции

ФлагОписание
-eEdit: открыть crontab в текстовом редакторе. После сохранения cron автоматически перечитает расписание. Редактор выбирается из $VISUAL или $EDITOR
-lList: вывести содержимое текущего crontab на стандартный вывод. Удобно для просмотра и сохранения в файл: crontab -l > backup.cron
-rRemove: удалить crontab пользователя полностью. Операция необратима — предварительно сохрани командой crontab -l
-iInteractive: запросить подтверждение перед удалением. Используй всегда с -r: crontab -ir
-u USERUser: управлять crontab указанного пользователя. Требует привилегий root. Пример: crontab -u www-data -l
FILEЗагрузить crontab из файла, полностью заменив текущий. Файл должен содержать полный crontab (не добавляет, а заменяет)
-Прочитать новый crontab из stdin: echo "*/5 * * * * cmd" | crontab -

Паттерны использования

Базовые операции с crontab

# Открыть редактор расписания
crontab -e

# Просмотреть текущее расписание
crontab -l

# Сохранить резервную копию
crontab -l > ~/crontab.backup

# Удалить с подтверждением
crontab -ir

# Управление crontab другого пользователя (root)
sudo crontab -u deploy -l
sudo crontab -u deploy -e

Добавление задачи без открытия редактора

# Добавить задачу к существующим
(crontab -l 2>/dev/null; echo "*/5 * * * * /usr/bin/check.sh") | crontab -

# Добавить несколько задач
(crontab -l 2>/dev/null; cat <<'EOF'
0 2 * * * /home/user/backup.sh
*/15 * * * * /home/user/monitor.sh
EOF
) | crontab -

# Удалить конкретную задачу (через grep -v)
crontab -l | grep -v "backup.sh" | crontab -

Загрузка расписания из файла

# Создать файл с расписанием
cat > /tmp/my-crontab << 'EOF'
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com

# Бэкап каждую ночь в 02:30
30 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

# Мониторинг каждые 5 минут
*/5 * * * * /opt/scripts/health-check.sh
EOF

# Загрузить в crontab
crontab /tmp/my-crontab

# Проверить
crontab -l

Лучшие практики строки crontab

# Полный пример надёжной строки crontab
# - абсолютный путь к команде
# - редирект stdout и stderr
# - экранирование % в date
# - комментарий для документирования

# Ежедневный бэкап БД в 02:00
0 2 * * * /usr/bin/pg_dump -U app mydb \
  >> /var/log/backup_$(date +\%Y\%m\%d).log 2>&1

# Запуск python-скрипта с virtualenv
0 * * * * /opt/myapp/venv/bin/python \
  /opt/myapp/tasks/hourly.py >> /var/log/tasks.log 2>&1

Полезные расписания

# Каждую минуту
* * * * *  /usr/bin/task.sh

# Каждые 10 минут
*/10 * * * *  /usr/bin/task.sh

# Каждый рабочий день в 8:00
0 8 * * 1-5  /usr/bin/morning.sh

# В конце месяца (последний день не всегда 31!)
0 23 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && /usr/bin/month-end.sh

# При перезагрузке системы
@reboot  sleep 30 && /opt/myapp/start.sh

Отладка и проверка crontab

# Проверить, запустились ли задачи
grep CRON /var/log/syslog | tail -20
journalctl -u cron --since "1 hour ago"

# Тест команды в среде cron (минимальный PATH)
env -i HOME=/home/user SHELL=/bin/bash \
    PATH=/usr/bin:/bin \
    /home/user/script.sh

# Проверить, что задача добавлена
crontab -l | grep "backup"

Советы и предупреждения

Совет: смени редактор для crontab
По умолчанию crontab -e может открыть nano или vi. Чтобы изменить редактор, установи переменную окружения: export VISUAL=nano или один раз: VISUAL=code crontab -e. Для постоянной настройки добавь export VISUAL=nano в ~/.bashrc.
Совет: тестируй команды перед добавлением в crontab
Перед добавлением в crontab проверь, что команда работает в условиях минимального окружения. Симулируй среду cron: env -i HOME=$HOME SHELL=/bin/sh PATH=/usr/bin:/bin /path/to/command. Частые проблемы: команда не в PATH, зависимость от ~/.bashrc, относительные пути.
Внимание: crontab -r удаляет всё без предупреждения
Команда crontab -r мгновенно удаляет весь crontab без запроса подтверждения и без возможности восстановления. Всегда используй crontab -ir (с флагом -i) или предварительно сохраняй резервную копию: crontab -l > ~/crontab.bak && crontab -ir. Легко перепутать с crontab -e при быстром вводе.
Внимание: не редактируй файл напрямую
Никогда не редактируй /var/spool/cron/crontabs/username напрямую через редактор. Демон cron отслеживает изменения через специальный механизм crontab. Прямое редактирование может привести к тому, что изменения будут проигнорированы или файл окажется заблокированным. Всегда используй crontab -e.