Планировщик CRON

From DD-WRT Wiki

Jump to: navigation, search


Contents


[edit] Введение

Cron - это стандартный процесс системного планировщика в системах Linux и *nix. Службу Cron, также называемую crond, можно включить в системах DD-WRT. Более старые версии DD-WRT используют имя и команду cron, а в более новых сборках имя cron было изменено на crond, однако они работают одинаково.

Cron можно включить в разделе Services → Services (прошивки версии v23) or Administration → Management (прошивки версии v24) веб-интерфейса DD-WRT.

Когда cron запускается во время загрузки устройства DD-WRT, он ищет определенные инструкции. Они могут быть введены непосредственно в веб-интерфейсе DD-WRT или, для более опытных пользователей, сохранены в файлах в определенных местах (см. далее). Всякий раз, когда инструкции cron сохраняются в виде файлов, они называются файлами crontab. Смотрите ссылки внизу этой статьи для создания инструкций cron.

[edit] Предварительные настройки

Поскольку Cron выполняет команды в соответствии с расписанием по текущему времени, дату и время маршрутизатора обычно следует синхронизировать по протоколу NTP. Конфигурация для NTP находится непосредственно на первой странице настройки в разделе Basic → Setup Basic.

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

  • Status → Router → Current Time.
  • Вы также можете проверить время в интерфейсе командной стоки (например, при подключении к маршрутизатору по протоколу SSH), набрав команду 'date'.

Чтобы убедиться, что Cron / Crond включен, перейдите к:

  • Administration → Management → Cron

и убедитесь, что он включен.

[edit] Расположение инструкций

Инструкции заданий Cron могут храниться как минимум в трех местах DD-WRT:

  1. Поместите инструкции в формате crontab в поля группы cron веб-интерфейса на экране Administration → Management. Это самый простой метод. При использовании команд stopservice cron && startservice cron в оболочке командной строки эти команды будут храниться в каталоге /tmp/cron.d/cron_jobs. Файлы, хранящиеся в /tmp, удаляются во время перезагрузки, поэтому было бы целесообразно сохранить копию любых необходимых команд, в идеале, используя смонтированную файловую систему или SD-карту, если ваш маршрутизатор оснащен таковой.
  2. Файлы Crontab можно создавать и сохранять в каталоге /tmp/cron.d, который хранится в оперативной памяти и теряется при перезапуске устройства DD-WRT или потере питания. Команды, добавленные в файл cron_jobs, отображаются на странице Administration → Management. Как отмечалось выше, использование stopservice cron && startservice cron сохранит эти команды в каталоге /tmp/cron.d/cron_jobs.
  3. Файлы Crontab могут храниться в /jffs/etc/crontab, если вы используете файловую систему JFFS. См. JFFS.

Важно, чтобы вы вошли как администратор "root" перед использованием указанных команд, иначе они не будут работать, как указано. В примерах, приведенных во внешних ссылках выше или где-либо еще, команды с префиксом "root" исключены. Примеры вне Wiki и сайта DD-WRT предназначены для систем Linux с несколькими учетными записями: cron обычно запускает инструкции внутри файлов crontab в зависимости от того, какой пользователь их создал. Без использования "root" ваш это работает только в Telnet или SSH (например, Putty), потому что вы уже вошли в систему как root.

[edit] Другие методы, старые версии

Другие методы, старые версии

  • Добавьте ваши инструкции в файл /tmp/crontab. Добавленные инструкции стираются при перезапуске. Следующая команда в Startup Command в веб-интерфейсе или в файле сценария (.sh), хранящемся в одном из мест, которые устройство DD-WRT сканирует во время запуска с расширением *.startup (см. статью Script_Execution):
echo '  *      *       *       *       *       root /bin/date > /tmp/test.txt' >> /tmp/crontab

который будет выглядеть так в файле /tmp/crontab:

  *      *       *       *       *       root /bin/date > /tmp/test.txt


  • Создайте файл в папке /tmp/cron.d/ (например, /tmp/cron.d/dosomething), используя формат crontab. Файл сценария, выполняемый при запуске устройства или в разделе Startup Command веб-интерфейса, может выглядеть следующим образом:
echo '* * * * * root /bin/date > /tmp/test.txt' > /tmp/cron.d/date

В файле dosomething выглядит так :

* * * * * root /bin/date > /tmp/test.txt

[edit] Перезапуск Crond

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

  • stopservice cron && startservice cron

Новые версии DD-WRT:

  • stopservice crond && startservice crond

Примечание: версия DD-WRT v24sp1 удаляет каталог /tmp/cron.d, когда служба cron остановлена. Вы должны остановить службу, создать каталог /tmp/cron.d, поместить скрипт cron в этот каталог, а затем перезапустить службу cron.

[edit] Дополнительная информация

Вы можете добавить это к своим командам запуска в разделе Startup Commands (Administration → Diagnostics в веб-интерфейсе), прежде чем добавлять какие-либо инструкции. Это добавит ясности в ваш файл crontab:

/bin/sh -c 'echo "# minute (0-59)," >> /tmp/crontab'
/bin/sh -c 'echo "# |      hour (0-23)," >> /tmp/crontab'
/bin/sh -c 'echo "# |      |       day of the month (1-31)," >> /tmp/crontab'
/bin/sh -c 'echo "# |      |       |       month of the year (1-12)," >> /tmp/crontab'
/bin/sh -c 'echo "# |      |       |       |       day of the week (0-6 with 0=Sunday)." >> /tmp/crontab'
/bin/sh -c 'echo "# |      |       |       |       |       commands" >> /tmp/crontab'

Обратите внимание: то, что выполняется в сценарии запуска, вызывается без оболочки, поэтому каналы stdout и stderr не будут интерпретироваться должным образом, если вы не вызовете оболочку вручную (/bin/sh -c).

Примечание. Если ваше устройство использует версию DD-WRT v23sp1, сценарий запуска не работает, поэтому вы можете сохранить все это как сценарий "firewall".

Если вы добавите это к своим командам автозапуска в разделе Startup Commands, вы увидите это в файле /tmp/crontab:

# 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

[edit] Общие проблемы

[edit] Различия в переменной $PATH

Cron работает с переменной $PATH, отличной от той, что есть в вашей оболочке командной строки, когда вы подключаетесь к маршрутизатору через Telnet/SSH. Переменная $PATH содержит места, где оболочка может искать файлы приложений, когда вы пытаетесь запустить их без указания полного пути к ним. Это означает, что Cron может не найти программы, которые вы пытаетесь использовать. Вы можете либо проверить, какой полный путь к программам используется с помощью команды which, а затем использовать полный путь в ваших скриптах, например /usr/bin/uptime, а не просто uptime, или вы можете проверить значение переменной $PATH, запустив echo PATH=$PATH в вашей оболочке, а затем скопировать вывод в верхнюю часть файла crontab или скрипта.

root@DD-WRT:~# which uptime
/usr/bin/uptime
root@DD-WRT:~# echo PATH=$PATH
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/jffs/sbin:/jffs/bin:/jffs/usr/sbin:/jffs/usr/bin:/mmc/sbin:/mmc/bin:/mmc/usr/sbin:/mmc/usr/bin:/opt/sbin:/opt/bin:/opt/usr/sbin:/opt/usr/bin

[edit] Служба CRON засыпает в прошивке версии V24

Служба cron часто засыпает, а задания cron не выполняются. Это требует перезапуска службы cron командами stopservice cron и startservice cron. Прошивки версии V23 не имеют этой проблемы.

исправлено в сборке r41189, согласно этой темы форума: https://forum.dd-wrt.com/phpBB2/viewtopic.php?t=321629

[edit] Рабочий каталог

Cron работает с тем же рабочим каталогом, который вы используете при подключении по протоколу Telnet/SSH к маршрутизатору:

root@DD-WRT:~# pwd
/tmp/root

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

[edit] Внешние ссылки