Иногда у владельцев NMT возникает вопрос в автоматизации рутинных процессов.
Например, задача резервного копирования служебных данных торрент-качалки.
В любом Linux должен быть планировщик. Зовут его cron.
cron выполняет команды в заданное время. Время вызова описывается инструкциями, помещенными в файлы crontab.
Проверить текущее расписание можно командой crontab -l. Например, для прошивки от декабря 2010 на NMT C-200, расписание выглядит следующим образом:
#-0
30 * * * * /etc/cron/cron.hourly
02 4 * * * /etc/cron/cron.daily
22 4 * * 0 /etc/cron/cron.weekly
#*/5 * * * * /bin/disktriger.sh
#bt
Разберемся с форматом
Первые 5 параметров строки, разделенных пробелами или табуляцией, задают время вызова скрипта, прописанного последним параметром.
Время в строке записывается в следующем порядке:
- минуты (0-59)
- часы (0-23)
- дни (1-31)
- месяцы (1-12)
- дни недели (0-7), причем воскресенье это 0 или 7, понедельник — 1, и так далее.
Рассмотрим на примере первого параметра — то есть минуты. Каждое из значений может быть:
- однократным (одно число). Число 10 — значит в десятую минуту;
- многократным (несколько чисел через запятую). 10,40 — в десятую и сороковую минуту;
- кратным делителю (дробная запись). */3 — каждую третью минуту, то есть — в 0, 3, 6 и так далее минут;
- любым (знак *).
Итак, наша первая строка со значениями вызывает скрипт cron.hourly каждый день недели, каждый месяц, в любой день и час, в 30 минут. Значит это событие будет вызвано в 0:30, 1:30, 2:30 и так далее до 23:30.
Вторая строка вызывает cron.daily каждый день недели, каждый месяц, каждый день в 4 часа и 2 минуты. То еcть в 4:02.
Третья для cron.weekly отрабатывает каждое воскресенье, в 4:22.
Знак # в начале строки делает продолжение строки комментарием.
Правим расписание
Команда
вызывает установленный у вас редактор, и вы можете построчно его отредактировать. Но, помня о том, что после перезагрузки плеера все ваши труды снова «обратятся в тыкву», то есть плеер будет девственно чист, есть более простой способ.
Создаем файл, например my.cron в каталоге пользовательских скриптов /share/Apps/LTU/user.scripts.
Повторим в этом файле родное расписание, убив последние, закоментированные строки, так как они все равно не исполняются, и добавим к нему собственные:
30 * * * * /etc/cron/cron.hourly
02 4 * * * /etc/cron/cron.daily
22 4 * * 0 /etc/cron/cron.weekly
# ниже добавляем свои строки - например вызов раз в 3 часа
0 */3 * * * /share/Apps/LTU/user.scripts/cp_trans.sh
Файл сохраняем, не забыв о Linux-формате (перевод строки LF).
Для добавленного в расписании файла-скрипта, надо выставить права:
Теперь в /share/Apps/LTU/user.scripts/on_start_nmt.sh добавляем строку:
Указание файла для crontab в качестве параметра вызывает перезагрузку текущего расписания.
Перезапускать самого демона cron в этом случае не нужно (проверено).
Вуалля!
Теперь вы вольны творить любые расписания, меняя только свой собственный файл.
15 марта 2011 г. в 01:45
Все это, конечно, интересно, но только нифига не работает. После загрузки всех приложений какая-то хрень затирает таблицу crontab, и она сбрасывается к исходному состоянию.
Я столкнулся с этим, когда пытался победить TorrentWatchX, который прекращает работу после перезагрузки плеера. Он тоже пишет в crontab в своем стартовом скрипте, и сразу после записи таблица выглядит как надо (проверялось добавлением отладочных команд). Однако если подключиться телнетом после полной загрузки всего, то таблица чистая. Проверялось без каких-либо приложений, кроме LTU.
Между прочим, в 100-й серии, судя по всему, та же хрень, поскольку проблема с TorrentWatchX была и там.
Хотелось бы выслушать «начальника транспортного цеха» Падавана, что может так круто гадить.
15 марта 2011 г. в 11:25
Рома, я проверил только что — результат от crontab -l:
#-0
30 * * * * /etc/cron/cron.hourly
02 4 * * * /etc/cron/cron.daily
22 4 * * 0 /etc/cron/cron.weekly
и это без штатной приписки в хвосте вывода крона:
#bt
То есть все в порядке (на декабрьской прошивке) — перезагружать свое собственное расписание скриптом on_start_nmt можно (и нужно)!
Ты точно прочитал — команду
не пропустил ?
15 марта 2011 г. в 13:35
Я свои строки добавлял — боролся с багом TorrentWatchX. На этапе выполнения стартового скрипта все нормально — команда
crontab -l >> /share/debug.txt,
добавленная в конец скрипта, показывает, что нужная строка записана, однако если ввести crontab -l в консоли после загрузки, таблица оказывается сброшенной. Такое впечатление, что какая-то зараза исполняет команду
crontab /etc/cron/root.crontab после загрузки всех пользовательских программ.
Буду еще экспериментировать, но увы, с моим уровнем знаний причину я вряд ли найду.
15 марта 2011 г. в 14:01
Тут «начальник транспортного цеха» пишет, что стартовый скрипт Трансмишина может гадить.
15 марта 2011 г. в 15:02
Угу — так и есть — стартанул — кронтаб уехал.
15 марта 2011 г. в 15:59
Похоже, гарантировано работают только hourly, daily и weekly.
15 марта 2011 г. в 16:17
Да ты успокойся!
добавь
crontab /share/Apps/LTU/user.scripts/my.cron
в хвост on_start_transmission.sh и будет тебе щастье!15 марта 2011 г. в 16:46
Мне другое нужно добавить, но все равно спасибо.:)
15 марта 2011 г. в 23:34
Кстати, получилось. Добавление записи для TorrentWatchX я таки пофиксил. Еще раз спасибо тебе, ну и, безусловно, Падавану.
30 марта 2011 г. в 12:06
Есть способ проще для организации автоматического запуска процессов, для этого необходимо добавить в оригинальное расписания crontab свое расписание.
Файлов с расписанием два это: /nmt/apps/etc/root.cron и /etc/cron/root.cron
В пользовательский скрипт /share/Apps/LTU/user.scripts/on_start_nmt.sh
добавляем следующие строки:
files[1]=/nmt/apps/etc/root.cron
files[2]=/etc/cron/root.cron
for x in 1 2 ; do
echo ‘*/20 * * * * if ! [ -n "`pgrep transmission`" ] ; then /share/Apps/LTU/bin/transmission-start ; fi’ >> ${files[x]}
done
в цикле непосредственно добавляемая строка в расписание, в моем случае это проверка запущен ли Transmission.