Crontab в Linux: автоматизация задач
Что вы найдёте в этой статье
- Быстрое определение crontab и зачем он нужен
- Команды для просмотра и редактирования crontab
- Формат строки задания и шаблоны расписаний
- Практические примеры (оповещения, резервное копирование, проверка сайтов)
- Руководство «безопасное добавление», чеклист для ролей, рекомендации по безопасности и отладке
- Альтернативы, когда cron не подходит
Что такое Crontab?
Crontab (cron table) — это демон и формат конфигурационных файлов, который запускает команды по расписанию на большинстве Linux-систем. Один файл crontab хранит список заданий (job) для конкретного пользователя. Cron идеален для периодических задач: резервного копирования, отправки отчётов, проверки состояния сервисов и запуска фоновых обработок.
Определение термина: crontab — файл/утилита, которая запускает команды по времени.
Базовые команды crontab
Каждый пользователь имеет собственный crontab-файл. Основные команды:
- crontab -l — показать все задания текущего пользователя.
- crontab -e — отредактировать crontab текущего пользователя.
- crontab -r — удалить все записи crontab текущего пользователя.
Чтобы работать с crontab другого пользователя, используйте опцию -u. Пример редактирования crontab пользователя jdoe:
sudo crontab -u jdoe -eСовет: запускайте crontab -l перед изменением, чтобы сохранить текущий файл и избежать непреднамерённой потери расписания.
Формат задания crontab
Каждое задание — одна строка в формате:
MINUTE HOUR DAY MONTH WEEKDAY COMMANDТаблица полей:
| Элемент | Диапазон | Описание |
|---|---|---|
| Minute | 0 - 59 | Минута выполнения. |
| Hour | 0 - 23 | Час выполнения (24-часовой формат). |
| Day | 1 - 31 | День месяца. |
| Month | 1 - 12 | Месяц (1 = Янв). |
| Weekday | 0 - 6 | День недели (0 = Воскресенье). |
| Command | Любая команда Linux, исполняемая в терминале. |
Звёздочка (*) означает «каждый» для соответствующего поля. Пример: выполнить каждый день в 03:20:
20 3 * * * /root/backup.shНесколько значений и шаги
- Список значений через запятую:
20,50 * * * * /path/to/command.sh— каждые 20 и 50 минут. - Шаги:
15 */3 * * * /path/to/command.sh— каждые 3 часа в 15 минут. - Диапазоны:
0 9-17 * * 1-5 /path/to/command.sh— по рабочим дням с 9 до 17 часов.
Пример подавления вывода
Чтобы вывод задания не попадал в системную почту, перенаправьте stdout и stderr:
0 6 15 * * /path/to/backup.sh > /dev/null 2>&1Либо используйте переменную MAILTO в верхней части файла:
MAILTO=""Как добавить задание
Команда crontab -e откроет ваш crontab в текстовом редакторе (обычно nano или vim). Каждое задание на новой строке. После сохранения файл автоматически активируется.
Пример редактирования:
crontab -eПодсказка по nano: Ctrl+O — сохранить, Ctrl+X — выйти. Для vim: :wq
Быстрая вставка задания одной командой
Можно добавить строку без открытия редактора:
(crontab -l; echo "0 14 * * 0 /path/to/command.sh";) | crontabЭта команда берёт текущее содержимое crontab, дописывает новую строку и загружает результат обратно. Всегда проверяйте вывод crontab -l, иначе можно нечаянно перезаписать crontab пустым файлом.
Просмотр и удаление
Показать задания:
crontab -lУдалить все задания:
crontab -rЧтобы удалить отдельную строку, отредактируйте (-e) и уберите её. Не злоупотребляйте -r на продуктивных системах.
Практические примеры
Воспроизвести звук каждые два часа
0 */2 * * * aplay /home/myuser/myalert.wavПлейлист на пятницу в 17:00:
0 17 * * 5 aplay /home/myuser/friday_song.mp4Резервное копирование с rsync
Cron удобно запускает скрипты резервного копирования, которые используют rsync или tar. Важно всегда указывать абсолютные пути и проверять права доступа.
Проверка работоспособности сайтов (скрипт PHP)
Сохраните скрипт как /home/myuser/check_sites.php (в файл скрипта замените email и URL на свои). Затем добавьте:
*/5 * * * * /usr/bin/php /home/myuser/check_sites.php > /dev/null 2>&1Код скрипта (как в оригинале):
0) {
mail($email, "Urgent - Sites Down!", "Your bot has detected the following sites are currently down:\n" . implode("\n", $down));
}
// Exit
exit(0);
/**
* Check URL
*/
function check_url(string $url):int
{
// Send via cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($ch);
// Get status, and close connection
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// Return
return $status;
}
Примечание: убедитесь, что PHP CLI установлен в /usr/bin/php или укажите корректный путь.
Советы по надёжному и безопасному использованию crontab
- Всегда указывайте абсолютные пути к скриптам и бинарникам (/usr/bin/php, /usr/bin/rsync).
- Задавайте в crontab переменные окружения (PATH, SHELL, MAILTO) вверху файла.
- Логируйте выходы задач в файлы, а не в системную почту:
/path/to/script.sh >> /var/log/myscript.log 2>&1. - Используйте блокировку, чтобы избежать одновременного запуска:
flock -n /var/lock/myscript.lock /path/to/script.sh. - Не храните секреты (пароли, ключи) в скриптах; используйте менеджеры секретов или права доступа.
Отладка crontab — распространённые проблемы и как их решать
- Пустой PATH: cron запускает оболочку с ограниченным PATH. Решение: в начале файла укажите
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin. - Права доступа: cron выполняет команды от имени владельца crontab. Проверьте права на скрипты и файлы.
- Различия окружения: добавьте
SHELL=/bin/bashи экспорт нужных переменных. - Временные зоны и переход на летнее время: cron использует системный часовой пояс; учтите DST для критичных расписаний.
- Конфликты параллельных запусков: используйте lock-файлы или системные механизмы.
Чеклист перед размещением задания в продакшн
- Тестирование команды вручную в том же окружении, что и cron.
- Указывание абсолютных путей для всех бинарников и файлов.
- Перенаправление stdout/stderr в лог-файл.
- Механизм блокировки для длительных задач.
- Минимальные права у пользователя, запускающего задание.
- Наличие мониторинга и алертов на неудачные запуски.
Рольные чеклисты
Для разработчика:
- Писать скрипты идемпотентными (повторный запуск не ломает данные).
- Логировать ошибки в понятный формат.
- Обрабатывать таймауты и возвратные коды.
Для системного администратора:
- Убедиться, что задания не конфликтуют по ресурсам.
- Настроить ротацию логов (logrotate) для файлов cron.
- Следить за правами и использованием сетевых ресурсов.
Для менеджера проекта:
- Подтвердить требования к SLA/временным окнам.
- Договориться о политике уведомлений и отката.
Когда cron не подходит и альтернативы
- systemd timers — альтернатива с более точным управлением зависимостями и журналированием (хорошо для новых дистрибутивов, где используется systemd).
- anacron — для задач, которые должны выполняться даже если система была выключена (ежедневные задания на ноутбуках/рабочих станциях).
- at — для одноразовых задач.
- fcron — более гибкая альтернатива для нестандартных систем.
Выбор: если нужна интеграция с systemd, используйте systemd timers; если важно выполнение при загрузке — anacron.
Шаблоны расписаний — шпаргалка
- Каждую минуту:
* * * * * - Каждые 5 минут:
*/5 * * * * - Каждый час в 0 минут:
0 * * * * - Каждый день в 03:30:
30 3 * * * - Каждый понедельник в 06:00:
0 6 * * 1 - Первое число месяца в 04:00:
0 4 1 * *
Примеры безопасности и жёсткого харднинга
- Запускать задания от пользователя с минимальными привилегиями.
- Избегать использования root, если это не критично.
- Устанавливать umask и проверять, какие файлы создаются.
- Хранить логи в защищённой директории с ограниченным доступом.
- Ограничивать сетевые права скриптов (например, использовать сетевые нейтральные контейнеры).
Частые ошибки и случаи, когда cron «подводит» (контрпримеры)
- Скрипт работает в интерактивной сессии, но не в cron (чаще всего из-за PATH или переменных окружения).
- Скрипт зависит от GUI или X-сессии.
- Долгие задания перекрывают друг друга и создают нагрузку.
- Отправка писем на внешние адреса блокируется политикой почтового сервиса.
Мини-методология: безопасное добавление задания
- Написать и протестировать скрипт вручную.
- Добавить логирование и обработку ошибок.
- Запустить скрипт через cron с перенаправлением вывода в лог.
- Проверить выполнение несколько раз и настроить оповещения.
- Включить мониторинг успешных/неуспешных запусков.
Пример playbook: развернуть резервное копирование
- Написать /usr/local/bin/backup.sh, указывая абсолютные пути и set -e.
- Тестировать скрипт вручную, проверять права доступа к удалённому серверу.
- Добавить в crontab:
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1- Настроить logrotate для /var/log/backup.log.
- Добавить алертинг (например, уведомление в Slack или почту при ошибке).
Критерии приёмки
- Задание успешно отрабатывает в crontab минимум три раза подряд.
- Логи содержат минимально достаточную информацию для диагностики.
- Нет конфликтов с другими задачами по ресурсам.
- Документация задания и контакт ответственного доступны команде.
Короткие шаблоны (cheat sheet)
- Быстро проверить crontab текущего пользователя:
crontab -l - Редактировать:
crontab -e - Удалить все:
crontab -r - Добавить строку не открывая редактор:
(crontab -l; echo "SCHEDULE COMMAND";) | crontab
Итог
Crontab — надёжный инструмент для регулярной автоматизации задач в Linux. Он прост в использовании, но требует внимательности: абсолютные пути, управление окружением, логирование и блокировка — ключевые практики для стабильной работы. Для сложных сценариев рассмотрите systemd timers или anacron. Не забывайте про безопасность, права и мониторинг.
Важно: перед развёртыванием в продуктиве протестируйте задания и настройте оповещения.
Краткое резюме:
- Crontab позволяет запускать команды по расписанию;
- Используйте
crontab -e/-l/-rи абсолютные пути; - Логируйте и обрабатывайте ошибки; блокируйте параллельные запуски;
- Рассмотрите альтернативы, если нужна интеграция с systemd или выполнение при пропуске расписания.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone