Регулярный запуск задач — cron

На прошлой неделе я показал вам, как запускать что-либо при каждой загрузке Raspberry Pi. Это не единственный способ; есть ещё „cron“. Но cron — это на самом деле более мощная команда: она позволяет запускать что угодно с регулярным интервалом, будь то каждую минуту, час, день, месяц или день недели!

Терминал SSH на Raspberry Pi

„cron“ — это сокращение от „chronograph“, то есть „хронограф“ или „часы“. Это демон (фоновый процесс), который позволяет планировать выполнение команд в определённое время. Эти события перечислены в файле, известном как „crontab“, что является сокращением от „cron table“ (таблица cron).

Просмотр расписания

Чтобы увидеть, что уже запланировано для выполнения, откройте окно терминала и выполните следующую команду:

crontab -l

которая, если вы ещё ничего не настраивали, будет содержать только комментарии:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command

Эта команда покажет только те задачи, которые запланированы для текущего пользователя. Если вы хотите увидеть, что запускается от имени пользователя root, используйте:

sudo crontab -l

Редактирование crontab

Чтобы отредактировать содержимое файла crontab, используйте:

crontab -e

(или sudo crontab -e для пользователя root).

Это откроет файл crontab в редакторе nano. Формат каждой строки должен быть следующим:

m h dom mon dow command

Где каждый параметр разделён пробелом и имеет следующие значения:

  • m — минута (от 0 до 59)

  • h — час (в 24-часовом формате, от 0 до 23)

  • dom — день месяца (от 1 до 31)

  • mon — месяц (от 1 до 12, или трёхбуквенное сокращение — jan, feb, mar и т.д.)

  • dow — день недели (от 0 до 6, где 0 — воскресенье, 1 — понедельник и т.д., или трёхбуквенное сокращение — sun, mon, tue и т.д.)

  • command — команда для выполнения

Специальные форматы

Помимо отдельных чисел для каждого из первых 5 параметров, вы также можете использовать следующие специальные форматы:

  • Последовательность чисел, разделённых запятой — например, 0,15,30,45

  • Диапазон — например, 4-8

  • Последовательность диапазонов — например, 0-15,30-45

  • Звёздочка, означающая «все» — например, *

  • Каждый n-й раз, добавив суффикс /c — например, */5 для каждой 5-й минуты.

Примечание

Вы не можете использовать трёхбуквенные сокращения в диапазонах.

Примеры

Примеры включают:

  • * * * * * command — запускается каждую минуту

  • 30 * * * * command — запускается каждые 30 минут

  • 30 9 * * 5 command — запускается каждую пятницу в 9:30 утра

Использование команд

Сама команда может быть любой командой оболочки — то есть тем, что вы вводите в окно терминала, или „shell“. Следующее простое задание cron записывает текущую дату в файл „file“ в вашей домашней директории каждую минуту:

* * * * * date >> file

Вы можете наблюдать за обновлением файла каждую минуту с помощью следующей команды:

tail -f ~/file

Запуск при перезагрузке

Вы также можете использовать специальный макрос времени @reboot, который запускает команду каждый раз, когда ваш Raspberry Pi перезагружается. Например:

@reboot echo 'Rebooted' >> ~/file

Вы даже можете запускать Python-файлы, используя команды точно так же, как вы запускали бы их из командной строки, так что вы могли бы, например, подключить светодиод (через резистор) и заставить его мигать каждый час. Ваше воображение — единственное ограничение!