Планирование процессов

Используйте незанятое время!

Система Linux может выдерживать сильную нагрузку, но обычно перегружается только в рабочее время. Будь это офис, серверная комната или дом, большинство систем Linux тратят попусту время утром, вечером, ночью и в выходные. Использование этого незанятого времени может быть намного дешевле, чем покупка компьютеров, которые вам точно потребуются, если вы захотите все делать в одно и то же время.

Существует три типа для задержки выполнения работ:

  • Небольшое ожидание, а затем возобновление выполнения задания, это делается командой sleep. Время запуска задания зависит от системного времени в момент подачи команды.
  • Выполнение команды в определенное время, используя команду at. Выполнение задания(ий) зависит от системного времени, а не от времени подачи команды.
  • Регулярный запуск команд по месяцам, неделям, дням или часам основано на использовании возможностей cron.

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

Команда sleep

Info-страница о сне, вероятно, одна из самых коротких. Все, что sleep делает, это ждет. По умолчанию время ожидания выражается в секундах.

Так зачем же она нужна? Некоторые практические примеры:

Кто-то звонит вам по телефону, вы говорите "Да, мы встретимся через полчаса", но вы тонете в работе и забываете про свой ланч:

(sleep 1800; echo "Lunch time..") &

Если вы не можете по какой-то причине использовать команду at, 5:00 часов, и вы хотите идти домой, но еще есть работа, которую предстоит сделать, а сейчас кто-то использует системные ресурсы:

(sleep 10000; myprogram) &

Убедитесь, что в вашей системе есть авто-выход, и что вы выходите из системы или блокируется ваш рабочий стол при подаче такого рода задания, или запустите ее в сессии.

Когда вы запускаете на распечатку ряд больших файлов, но вы хотите, чтобы другие пользователи имели возможность печати между ними:

lp lotoftext; sleep 900; lp hugefile; sleep 900; lp anotherlargefile

Печать файлов обсуждается в Главе 8, Принтеры и печать.

Программисты часто используют команду sleep для остановки выполнения скрипта или программы на определенное время.

Команда at

Команда at выполняет команды в данный момент времени, используя вашу оболочку по умолчанию, если вы не укажете команде иное (см. man-страницу).

Опции at достаточно понятны, что продемонстрировано в примере ниже:

steven@home:~> at tomorrow + 2 days
warning: commands will be executed using (in order) a) $SHELL
        b) login shell c) /bin/sh
at>  cat reports | mail myboss@mycompany
at> 
job 1 at 2001-06-16 12:36

Нажатие Ctrl + D завершает работу утилиты at и создает сообщение "EOT".

Пользователь steven делает здесь странные вещи, объединяя две команды; мы будем изучать подобную практику в Главе 5, Перенаправление ввода-вывода.

steven@home:~> at 0237
warning: commands will be executed using (in order) a) $SHELL
        b) login shell c) /bin/sh
at>  cd new-programs
at>  ./configure; make
at> 
job 2 at 2001-06-14 02:00

Опция -m отправляет сообщение пользователю, когда задание выполнено, или разъяснение, когда работа не может быть сделана. Команда atq создает список заданий; выполните эту команду перед отправкой заданий в целях предотвращения их от запуска одновременно с другими. Командой atrm можно удалить запланированные задания, если вы изменили свою точку зрения.

Хорошая идея выбрать необычное время выполнения, потому что системные задания часто работают "круглые" часы, как вы можете увидеть в Разделе "Cron и crontab" далее. Например, задания часто запускаются ровно в 1:00 утра (например, системы, индексирующие обновление стандартной локальной базы данных), поэтому ввод времени 0100 легко может замедлить работу системы, а не увеличить ее. Чтобы предотвратить задания от запуска всех в одно и то же время, вы можете также использовать команду batch, которая ставит процессы в очередь и задает работу системе сбалансированным образом, предотвращая чрезмерные очереди использования системных ресурсов. Смотрите info-страницы для получения дополнительной информации.

Cron и crontab

Система cron находится под управлением демона cron. Он получает информацию из записей crontab системы и пользователей о том, какие программы и когда должны работать. Только пользователь root имеет доступ к системным crontab, в то время как у каждого пользователя должен быть доступ только к собственным crontab. На некоторых системах у (некоторых) пользователей отсутствует доступ к объекту cron.

При запуске системы демон cron ищет /var/spool/cron/ на наличие записей crontab, названных в честь аккаунтов в /etc/passwd, он ищет /etc/cron.d/ и /etc/crontab, а затем ежеминутно использует эту информацию для проверки, есть ли что-то что нужно сделать. Он выполняет команды от пользователя, который является собственником файла crontab и отправляет владельцу на mail все выданные команды.

В системах, использующих хрон Vixie, задания, которые выполняются ежечасно, ежедневно, еженедельно и ежемесячно хранятся в отдельной директории в /etc чтобы было легче просматривать. Это отличается от стандартной функции хрон UNIX, где все задачи вводятся в один большой файл.

Пример файла crontab Vixie:

[root@blob /etc]# more crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
# commands to execute every hour
01 * * * * root run-parts /etc/cron.hourly
# commands to execute every day
02 4 * * * root run-parts /etc/cron.daily
# commands to execute every week
22 4 * * 0 root run-parts /etc/cron.weekly
commands to execute every month
42 4 1 * * root run-parts /etc/cron.monthly

Альтернатива.
Вы можете также использовать команду crontab -l для отображения всех файлов crontab.

После установки некоторых переменных, появляется текущее расписание, по одной строке на задание, начинающиеся с 5-ти полей даты и времени. Первое поле содержит минут (от 0 до 59), второе - определяет час исполнения (0-23), третее - день месяца (1-31), и, наконец, номер месяца (1-12) , последнее - день недели (0-7, где 0 и 7 - это воскресенье). Звездочка в этих полях обозначает общий предел для поля. Списки допускаются; для выполнения заданий с понедельника по пятницу введите 1-5 в последнем поле, чтобы выполнить работу в понедельник, среду и пятницу введите 1,3,5.

Затем указывается пользователь, который должен выполнить процессы, которые перечислены в последнем столбце. Пример выше из конфигурации хрона Vixie, где root запускает программу run-parts на регулярной основе с соответствующими каталогами в качестве опций. В этих каталогах фактические задания для выполнения в назначенное время хранятся в виде скриптов, как этот маленький скрипт, который выполняется ежедневно, чтобы обновить базу данных, используемую командой locate:

billy@ahost cron.daily]$ cat slocate.cron
#!/bin/sh
renice +19 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "nfs,smbfs,ncpfs,proc,devpts" -e \
"/tmp,/var/tmp, /usr/tmp,/afs,/net"

Пользователи должны отредактировать для своих crontab безопасный способ использования команды crontab -e. Это позволит предотвратить пользователя от случайного открытия более чем одной копии его/ее файла crontab. По умолчанию предоставлен редактор vi (см. Главу 6, Текстовые редакторы), но вы можете использовать любой текстовый редактор, такой как gvim или gedit, если вам более комфортно с редактором GUI.

При выходе система сообщит вам, что установлен новый crontab.

Эта запись crontab напоминает billy пойти в его спортивный клуб каждый вечер четверга:

billy:~> crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.20264 installed on Sun Jul 20 22:35:14 2003)
# (Cron version -- $Id: chap4.xml,v 1.28 2007/09/19 12:22:26 tille Exp $)
38 16 * * 3 mail -s "sports evening" billy

После добавления нового запланированного задания, система сообщит вам, что новый crontab установлен. Вам не нужно перезапустить демон cron, чтобы изменения вступили в силу. В примере billy добавил новую строку, указывающую на сценарий резервного копирования:

billy:~> crontab -e
45 15 * * 3 mail -s "sports evening" billy
4 4 * * 4,7 /home/billy/bin/backup.sh

<--write and quit-->

crontab: installing new crontab

billy:~>

Скрипт backup.sh запускается каждые четверг и воскресенье. См. Раздел "Сценарии оболочки" для введения в написание скриптов для оболочки. Имейте в виду, что вывод команд, если таковые имеются, отправляются по почте владельцу файла crontab. Если почтовая служба не настроена, можно найти вывод ваших команд в вашем локальном почтовом ящике, /var/spool/mail/, в виде обычного текстового файла.

Кто запускает мои команды?
Вы не можете устанавливать пользователей, которые должны выполнять команды. Они выполняются с полномочиями пользователя по умолчанию.