Запуск по расписанию: cron и crontab
Откройте своё расписание:
crontab -eПри первом запуске команда предложит выбрать редактор — проще всего nano. Допишите в конец файла строку задания, сохраните (Ctrl+O, Enter) и выйдите (Ctrl+X):
30 3 * * * /home/ivan/backup.sh >> /home/ivan/backup.log 2>&1Это значит: каждый день в 3:30 запускать /home/ivan/backup.sh, а всё, что он выводит, дописывать в backup.log. Посмотреть своё расписание — crontab -l.
Формат строки
Пять полей времени через пробел, затем команда:
| Поле | Значения |
|---|---|
| минута | 0–59 |
| час | 0–23 |
| день месяца | 1–31 |
| месяц | 1–12 |
| день недели | 0–7 (0 и 7 — воскресенье, 1 — понедельник) |
* — любое значение, */10 — каждое десятое, 1-5 — диапазон, 1,15 — список.
| Строка времени | Когда |
|---|---|
*/5 * * * * | каждые 5 минут |
0 * * * * | каждый час, в 00 минут |
0 9 * * 1-5 | в 9:00 по будням |
0 0 1 * * | в полночь первого числа каждого месяца |
@reboot | один раз при запуске системы |
@daily | раз в сутки, в полночь |
Время — по часовому поясу системы. Как его проверить и сменить — в справке Как сменить часовой пояс и настроить время.
Пример скрипта
Файл /home/ivan/backup.sh (создайте его в nano):
#!/bin/bash
mkdir -p /home/ivan/backup
tar -czf "/home/ivan/backup/docs-$(date +%F).tar.gz" /home/ivan/ДокументыСкрипт складывает папку документов в архив с датой в имени. Сделайте его исполняемым и проверьте вручную, прежде чем ставить в расписание:
chmod +x /home/ivan/backup.sh
/home/ivan/backup.shПочему задание не срабатывает
- Короткий PATH (список папок, где система ищет программы по имени). Задания cron видят только
/usr/binи/bin. Программы из других папок пишите с полным путём — его показываетwhich имя(например,/usr/local/bin/…или/snap/bin/…). - Знак
%. В строке crontab%означает перевод строки. Прямо в строке задания его нужно экранировать:date +\%F. В самом скрипте, как в примере выше, — не нужно. - Нет прав на запуск. Скрипту нужен
chmod +xи первая строка#!/bin/bash. - Вывод пропадает. У cron нет терминала: всё, что задание печатает, cron пытается отправить почтой, а без почтового сервера выбрасывает. Дописывайте
>> файл.log 2>&1, чтобы видеть вывод и ошибки. - Относительные пути. Задание запускается в домашней папке, а не там, где лежит скрипт. Пишите полные пути или переходите в нужную папку внутри скрипта.
Запуски заданий видны в журнале:
journalctl -u cron --since todayЗадания root и системные
sudo crontab -e— расписание root, для команд, которым нужны права администратора.- Файлы в
/etc/cron.d/и/etc/crontab— системные расписания. В их строках после времени стоит ещё и имя пользователя, от которого запускать команду. - Скрипты из папок
/etc/cron.daily/,/etc/cron.weekly/и/etc/cron.monthly/выполняются раз в день, неделю и месяц. Имя скрипта там — без точки: файлbackup.shбудет пропущен, аbackup— выполнен.
crontab -r удаляет всё расписание сразу и без вопросов, а на клавиатуре r стоит рядом с e. Перед правками полезно сохранить копию: crontab -l > ~/crontab-copy.txt.
Вместо cron можно использовать таймеры systemd — они пишут вывод в журнал сами и умеют догонять пропущенные запуски. Для простых заданий cron проще.