Короче так... "Настраиваем CRON, который есть в прошивке"
Проверяем наличие crond в прошивке
1.1 Используем встроенный в прошивку crond. Если вы устанавливали crond через ipkg, сделайте ipkg remove cron
1.2 Проверяем, есть ли у нас crond, встроенный в прошивку.
ls /usr/sbin/crond
/usr/sbin/crond Это должно быть. Если нет, то у вас нет встроенного crond
Создаем файлы и папки
2.0 Вступление. Дабы не заниматься фигнёй, мы создаем файл crontab, например, на флешке. Чтобы проще редактировать и т.д. Для этого я использую папку /opt/scripts/crondata в данном примере. В этой папке у меня все что относится к cron'у - crontab и скрипты типа cron.5mins. Сразу оговорюсь, я не использую run-parts, таким образом, у меня crond запускает сам скрипт, а не (как во многих мануалах) "все скрипты из папки cron.5min" .
2.1 Создаем папку crondata
Code:
mkdir -p /opt/scripts/crondata
2.1 Создаем файл crontab и сценарии
Он у меня называется _crontab. cron работает не непосредственно с ним, так что использован символ "_".
Code:
touch /opt/scripts/crondata/_crontab
touch /opt/scripts/crondata/cron.5min
touch /opt/scripts/crondata/cron.daily
touch /opt/scripts/crondata/cron.hourly
touch /opt/scripts/crondata/cron.weekly
Делаем исполняемые файлы исполняемыми
Code:
chmod +x /opt/scripts/crondata/cron.*
2.2 Заполняем файл crontab содержимым**:
Code:
SHELL=/bin/sh
#min hr dayOfM month dayOfW command
*/5 * * * * /opt/scripts/crondata/cron.5min
5 * * * * /opt/scripts/crondata/cron.hourly
10 1 * * * /opt/scripts/crondata/cron.daily
15 1 * * 1 /opt/scripts/crondata/cron.weekly
Правила заполнения можно почитать тут. Я предпочитаю не использовать переменную PATH (в место этого указываю полные пути ко всему).
2.3 Заполняем файлы cron.*
Заполняем содержимым файлы cron.*. Напомню, что певая строка содержит упоминание интерпретатора (/bin/sh в моем случае). Вторая строка запускает программу logger. В данном случае logger должен добавить в системный журнал событие (во столько-то запущен cron-daily)*
Code:
#!/bin/sh
logger [CRON-DAILY] #Меняем на weekly\hourly\5mins=\в зависимости от скрипта
#Ваши команды. Указывайте полные пути ко всему!
Отдельно замечу: файл /opt/scripts/crondata/cron.5min я использую только для проверки работоспособности crond. Так что его содержимое состоит из одного logger-а
Code:
#!/bin/sh
logger [CRON-5MIN]
Добавляем в автозапуск
3.0 Учить, как именно настраивать post-mount не буду - ищите сами.
3.1 Добавляем в post-mount
В комментариях упоминается admin как суперпользователь. У вас он может быть root или еще как нибудь. В общем, скрипт учитывает это, и admin упоминается только в комментариях
Code:
#!/bin/sh
#Префикс для системного журнала
c_prefix=[INIT][CROND]
#Где встроенный crond ищет свои конфиги
c_main_crontab_dir=/var/spool/cron/crontabs
#Где наш crontab
c_opt_crontab=/opt/scripts/crondata/_crontab
#Определяем имя root-а (по-умолчанию он admin, но вдруг вы поменяли?)
c_root_username=` cat /etc/passwd | /bin/grep :0:0: | /usr/bin/awk -F: '{print $1}'`
#встроенный cron будучи запущеным от пользователя admin(root\..) будет искать свои данные crontab в файле /var/spool/cron/crontabs/admin
c_main_crontab_file=$c_main_crontab_dir/$c_root_username
#Логируемся
logger $c_prefix Creating crontabs files for "$c_root_username"
#Создаем папку /var/spool/cron/crontabs
mkdir -p $c_main_crontab_dir
#создаем файл /var/spool/cron/crontabs/admin
touch $c_main_crontab_file
#Логируемся
logger $c_prefix Adding $c_opt_crontab to $c_main_crontab_file
#Переносим все из файла /opt/scripts/crondata/_crontab в /var/spool/cron/crontabs/admin
cat $c_opt_crontab >> $c_main_crontab_file
#Логируемся
logger $c_prefix Starting crond
#Запускаем crond
/usr/sbin/crond -b -S -c $c_main_crontab_dir
#Логируем "crond script finished"
logger $c_prefix crond script finished
Проверяем
Сохраняем flashfs, перезагружаем роутер.
Смотрим логи.
Ищем это
Code:
Apr 16 16:22:34 admin: [INIT][CROND] Creating crontabs files for admin
Apr 16 16:22:34 admin: [INIT][CROND] Adding /opt/scripts/crondata/_crontab to /var/spool/cron/crontabs/admin
Apr 16 16:22:34 admin: [INIT][CROND] Starting crond
Apr 16 16:22:34 crond[433]: crond: crond (busybox 1.18.4) started, log level 8
Apr 16 16:22:35 admin: [INIT][CROND] Script finished
Заходим на роутер, проверяем служебный crontab
#admin заменить на ваш логин в роутере
cat /var/spool/cron/crontabs/admin
Должно отобразиться то же содержимое что и у /opt/scripts/crondata/_crontab
В течении 6 минут должна появиться запись
Code:
Apr 16 19:05:01 crond[433]: crond: USER admin pid 465 cmd /opt/scripts/crondata/cron.5min
Apr 16 19:05:01 admin: [CRON-5MIN]
Появилась - значит работает.
Сноски:
* logger <text> добавляет text в syslog датой выполнения. То есть можно так отслеживать свои сценарии и т.д.
**
*/5 * * * * /opt/scripts/crondata/cron.5min ВЫПОЛНЯЕТСЯ каждые 5 минут
5 * * * * /opt/scripts/crondata/cron.hourly ВЫПОЛНЯЕТСЯ каждый час, на пятой минуте часа (в 0:05, 1:05, 2:05,...)
10 1 * * * /opt/scripts/crondata/cron.daily ВЫПОЛНЯЕТСЯ каждый день в 1:10
15 1 * * 1 /opt/scripts/crondata/cron.weekly ВЫПОЛНЯЕТСЯ каждый понедельник 1:15
В crontab: 0 -воскресение, 1 - понедельник, .... 6 - суббота
МОГ ГДЕ_ТО ОШИБИТЬСЯ. С РАДОСТЬЮ ПРИМУ ПОПРАВКИ В ЛИЧКУ