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, все пользователи кроме перечисленных имеют доступ.
Синтаксис
- -u USER — управлять crontab указанного пользователя (только root)
- FILE — файл с новым расписанием; заменяет текущий crontab
- - — читать новый crontab из стандартного ввода
Формат строки crontab
Флаги и опции
| Флаг | Описание |
|---|---|
-e | Edit: открыть crontab в текстовом редакторе. После сохранения cron автоматически перечитает расписание. Редактор выбирается из $VISUAL или $EDITOR |
-l | List: вывести содержимое текущего crontab на стандартный вывод. Удобно для просмотра и сохранения в файл: crontab -l > backup.cron |
-r | Remove: удалить crontab пользователя полностью. Операция необратима — предварительно сохрани командой crontab -l |
-i | Interactive: запросить подтверждение перед удалением. Используй всегда с -r: crontab -ir |
-u USER | User: управлять 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 -e может открыть nano или vi. Чтобы изменить редактор, установи переменную окружения: export VISUAL=nano или один раз: VISUAL=code crontab -e. Для постоянной настройки добавь export VISUAL=nano в ~/.bashrc.
Перед добавлением в crontab проверь, что команда работает в условиях минимального окружения. Симулируй среду cron:
env -i HOME=$HOME SHELL=/bin/sh PATH=/usr/bin:/bin /path/to/command. Частые проблемы: команда не в PATH, зависимость от ~/.bashrc, относительные пути.
Команда
crontab -r мгновенно удаляет весь crontab без запроса подтверждения и без возможности восстановления. Всегда используй crontab -ir (с флагом -i) или предварительно сохраняй резервную копию: crontab -l > ~/crontab.bak && crontab -ir. Легко перепутать с crontab -e при быстром вводе.
Никогда не редактируй
/var/spool/cron/crontabs/username напрямую через редактор. Демон cron отслеживает изменения через специальный механизм crontab. Прямое редактирование может привести к тому, что изменения будут проигнорированы или файл окажется заблокированным. Всегда используй crontab -e.