Скрипты можно использовать для автоматизации тех или иных задач. Очень часто при этом требуется организовать выполнение скрипта в заданное время или через определённые интервалы времени. Для этого существует специальный демон — crond.
Для настройки программ на регулярное выполнение используется файл конфигурации, который можно посмотреть командной crontab -l и изменить командой crontab -e.
Рассмотрим такой файл:
$ crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/.private/student/crontab.6WaeT9 installed on Mon Mar 17 12:39:10 2008)
# (Cron version V5.0 -- vixie-cron-4.1.20060426-alt3)
#minute (0-59),
#| hour (0-23),
#| | day of the month (1-31),
#| | | month of the year (1-12),
#| | | | day of the week (0-6 with 0=Sunday).
#| | | | | commands
*/1 * * * * /var/www/bin/log-local.sh
*/2 * * * * /var/www/bin/log-snmp.sh
Строки, начинающиеся с # — как обычно, комментарии. Для каждой из запускаемых команд указывается, когда её надо выполнить. Для этого используются пять полей — минуты, часы, дни месяца, месяцы и дни недели. Для каждого из полей можно указать или какое-либо определённое значение, или *, что означает «для всех».
Рассмотрим значения этих полей на примера вызова программы /bin/false:
* * * * * /bin/false | Запускать каждую минуту (каждого часа, каждого дня, каждого месяца, в любой день недели) |
*/3 * * * * /bin/false | Запускать каждые три минуты (каждого часа, каждого дня, каждого месяца, в любой день недели) |
*/3 1-2 * * * /bin/false | Запускать каждые три минуты первого и второго часа ночи (каждого дня, каждого месяца, в любой день недели) |
1 1,6 * * * /bin/false | Запускать в первую минуту первого и шестого часа ночи, т.е. в 01:01 и 06:01 (каждого дня, каждого месяца, в любой день недели) |
1 1 * * 1 /bin/false | Запускать в 01:01 каждый понедельник |
1 1 * 2 1 /bin/false | Запускать в 01:01 каждый понедельник февраля |
* * 13 * 5 /bin/false | Запускать каждую минуту каждого часа 13 числа каждого месяца, приходящегося на пятницу |
При выполнении по cron'у задач, которые потенциально могут выполняться длительное время, следует предусмотреть и блокировать повторный запуск cron'ом скрипта в то время, когда ещё не успел завершиться предыдущий. Обычно такое можно делать, создавая и анализируя при запуске скрипта файл блокировки. Например:
$ cat lock.sh
#!/bin/bash
LOCK=/tmp/file.lock
if [ -f "$LOCK" ]; then
echo 'Скрипт уже работает'
exit 1
fi
touch "$LOCK"
sleep 1m
rm -f "$LOCK"
Здесь при запуске скрипта проверяется существование файла, и если он существует, то выполнение скрипта завершается. Иначе файл создаётся, выполняется некое действие (в данном случае — просто ожидание на 1 минуту), и перед завершением работы файл блокировки удаляется.
Пример выполнения:
$./lock.sh &
[2] 7704
$ Скрипт уже работает
[2]+ Exit 1./lock.sh