Настройка планировщика cron и формат таблиц crontab

Иногда в 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