Иногда в unix системе может потребоваться исполнение какой-то задачи с определенной периодичностью.
Например, одна из задач, которые мне приходилось решать, это ограничение максимальной и минимальной скорости вращения вентилятор на радиаторе видеокарты, при старте системы.
Сами команды, в моем случае, были примерно такие:
echo 10 > /sys/class/hwmon/hwmon2/pwm1_min echo 10 > /sys/class/hwmon/hwmon2/pwm1_max
Но как сделать так, чтобы система исполняла эти команды, например, при старте?
Для этого в unix системах предусмотрен планировщик cron. Сервис cron читает таблицы crontab в которых распознает время и команду и исполняет команду в соответствии с заданными значениями времени исполнения.
Для начала давайте посмотрим, какие задачи сейчас, запущены сервисом cron. Для этого исполним команду
service cron status
В результате вы должны получить что-то вроде:
root@home:~# service cron [info] Usage: /etc/init.d/cron {start|stop|status|restart|reload|force-reload}. root@home:~# service cron status ● cron.service - Regular background program processing daemon Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2020-03-09 21:06:38 EET; 40min ago Docs: man:cron(8) Main PID: 953 (cron) Tasks: 1 (limit: 4915) CGroup: /system.slice/cron.service └─953 /usr/sbin/cron -f мар 09 21:45:01 home CRON[11860]: pam_unix(cron:session): session opened for user root by (uid=0) мар 09 21:45:01 home CRON[11858]: pam_unix(cron:session): session opened for user root by (uid=0) мар 09 21:45:01 home CRON[11862]: (root) CMD (/usr/local/sbin/checkshutdown.sh) мар 09 21:45:01 home CRON[11863]: (root) CMD (if [ -x /etc/munin/plugins/apt_all ]; then /etc/munin/plugins/apt_all update 7200 12 >/dev/null; elif [ -x /etc/munin/plugins/ мар 09 21:45:01 home CRON[11865]: (munin) CMD (if [ -x /usr/bin/munin-cron ]; then /usr/bin/munin-cron; fi) мар 09 21:46:01 home CRON[13123]: pam_unix(cron:session): session opened for user root by (uid=0) мар 09 21:46:01 home CRON[13124]: pam_unix(cron:session): session opened for user root by (uid=0) мар 09 21:46:01 home CRON[13125]: (root) CMD (/usr/local/sbin/checkreboot.sh) мар 09 21:46:01 home CRON[13126]: (root) CMD (/usr/local/sbin/checkshutdown.sh) мар 09 21:46:01 home CRON[13123]: pam_unix(cron:session): session closed for user root lines 1-19/19 (END)
Затем нужно добавить в crontab таблицу инструкцию в следующем формате
* * * * * выполняемая команда - - - - - | | | | | | | | | ----- день недели (0—7) (воскресенье = 0 или 7) | | | ------- месяц (1—12) | | --------- день (1—31) | ----------- час (0—23) ------------- минута (0—59)
Для добавления инструкции в таблицу crontab нужно выполнить следующую команду в консоли
crontab -e
И отредактировать файл планировщика указав необходимые значения m (минуты) h (часа) dom (дня месяца) mon (месяца) dow (дня недели) user (пользователя, в случае запуска от пользователя) command (команды)
Формат значений времени имеет следующие типы:
Значение | Тип | Описание |
9 | Целое значение | Выполнять в 9am |
6,7,10 | Несколько значений | Выполнять в 6, 7 и 10am |
6-9 | Диапазон | Выполнять каждый час между 6-9 AM (включительно) |
*/2 | Дробь | Выполнять каждый 2-ой час, т.е. 0 (полночь), 2am, 4am, 6am, и т.д. |
3-12/3 | Дробный диапазоном | Выполнять каждый 3-ий час между 3am и 12pm, т.е. 3am, 6am, 9am, 12pm |
Кроме числовых значений, есть зарезервированные с числовыми эквивалентами:
Значение | Описание | Эквивалент |
@reboot | Выполнять при загрузке операционной системы | — |
@yearly | Выполнять ежегодно в полночь 1-го января | 0 0 1 1 * |
@annually | Выполнять ежегодно в полночь 1-го января | 0 0 1 1 * |
@monthly | Выполнять ежемесячно в полночь 1-го числа | 0 0 1 * * |
@weekly | Выполнять в полночь каждый понедельник | 0 0 * * 0 |
@daily | Выполнять ежедневно в полночь | 0 0 * * * |
@midnight | Выполнять ежедневно в полночь | 0 0 * * * |
@hourly | Выполнять в начале каждого часа | 0 * * * * |
В моем случае потребовалось добавить конструкцию следующего вида:
@reboot echo 10 > /sys/class/hwmon/hwmon2/pwm1_min
Примеры наиболее распространенных cron заданий:
Рассписание | Задание |
---|---|
* * * * * | echo «Запуск cron задания каждую минуту» |
*/5 * * * * | echo «Запуск cron задание каждые 5 минут» |
*/30 * * * * | echo «Запуск cron задания каждые 30 минут» |
0 * * * * | echo «Запуск cron задания каждый час» |
0 */3 * * * | echo «Запуск cron задания каждые 3 часа» |
0 13 * * * | echo «Запуск cron задания каждый день в 13:00» |
30 2 * * * | echo «Запуск cron задания каждый день в 2:30» |
0 0 * * * | echo «Выполнять задание каждый день в полночь» |
0 0 * * 0 | echo «Запуск cron задания каждое Воскресенье» |
0 0 * * 1 | echo «Запуск cron задания каждый Понедельник» |
0 0 1 * * | echo «Запуск cron задания в первый день каждого месяца» |
0 0 1 1 * | echo «Запуск cron задания каждый год первого Января» |
Кроме этого, cron можно запустить относительно конкретного пользователя. Например для запуска команды, оносительно пользователя username нужно исполнить команду
crontab -u username -e
В таком случае планировщик будет исполняться, оносительно пользователя username
А посмотреть таблицы crontab пользователя можно командой:
crontab -u username -l
Что интересно, пользователь root имеет отдельный crontab отличный от системного, поэтому команды (ниже) скорее всего выведут разный результат.
crontab -l crontab -u root -l