NMT-200 ЧаВо

Работаем по расписанию (cron)

Статья WildFlexy от 20.02.2011
Редакция от 09.06.2011

Иногда у владельцев NMT возникает вопрос в автоматизации рутинных процессов.
Например, задача резервного копирования служебных данных торрент-качалки.

В любом Linux должен быть планировщик. Зовут его cron.

cron выполняет команды в заданное время. Время вызова описывается инструкциями, помещенными в файлы crontab.

Проверить текущее расписание можно командой crontab -l. Например, для прошивки от декабря 2010 на NMT C-200, расписание выглядит следующим образом:

PCH-C200[~]# crontab -l
#-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.

Знак # в начале строки делает продолжение строки комментарием.

Правим расписание

Команда

crontab -e

вызывает установленный у вас редактор, и вы можете построчно его отредактировать. Но, помня о том, что после перезагрузки плеера все ваши труды снова «обратятся в тыкву», то есть плеер будет девственно чист, есть более простой способ.

Создаем файл, например my.cron в каталоге пользовательских скриптов /share/Apps/LTU/user.scripts.
Повторим в этом файле родное расписание, убив последние, закоментированные строки, так как они все равно не исполняются, и добавим к нему собственные:

#-0
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).
Для добавленного в расписании файла-скрипта, надо выставить права:

chmod 777 /share/Apps/LTU/user.scripts/cp_trans.sh

Теперь в /share/Apps/LTU/user.scripts/on_start_nmt.sh добавляем строку:

crontab /share/Apps/LTU/user.scripts/my.cron

Указание файла для crontab в качестве параметра вызывает перезагрузку текущего расписания.
Перезапускать самого демона cron в этом случае не нужно (проверено).

Вуалля!
Теперь вы вольны творить любые расписания, меняя только свой собственный файл.

10 комментариев к этой записи

  • Roman_V_M

    Все это, конечно, интересно, но только нифига не работает. После загрузки всех приложений какая-то хрень затирает таблицу crontab, и она сбрасывается к исходному состоянию.
    Я столкнулся с этим, когда пытался победить TorrentWatchX, который прекращает работу после перезагрузки плеера. Он тоже пишет в crontab в своем стартовом скрипте, и сразу после записи таблица выглядит как надо (проверялось добавлением отладочных команд). Однако если подключиться телнетом после полной загрузки всего, то таблица чистая. Проверялось без каких-либо приложений, кроме LTU.
    Между прочим, в 100-й серии, судя по всему, та же хрень, поскольку проблема с TorrentWatchX была и там.
    Хотелось бы выслушать «начальника транспортного цеха» Падавана, что может так круто гадить.

    • WildFlexy

      Рома, я проверил только что — результат от crontab -l:

      PCH-C200[~]# crontab -l
      #-0
      30 * * * * /etc/cron/cron.hourly
      02 4 * * * /etc/cron/cron.daily
      22 4 * * 0 /etc/cron/cron.weekly

      и это без штатной приписки в хвосте вывода крона:

      #*/5 * * * * /bin/disktriger.sh
      #bt

      То есть все в порядке (на декабрьской прошивке) — перезагружать свое собственное расписание скриптом on_start_nmt можно (и нужно)!

      Ты точно прочитал — команду

      crontab /share/Apps/LTU/user.scripts/my.cron

      не пропустил ?

      • Roman_V_M

        Я свои строки добавлял — боролся с багом TorrentWatchX. На этапе выполнения стартового скрипта все нормально — команда
        crontab -l >> /share/debug.txt,
        добавленная в конец скрипта, показывает, что нужная строка записана, однако если ввести crontab -l в консоли после загрузки, таблица оказывается сброшенной. Такое впечатление, что какая-то зараза исполняет команду
        crontab /etc/cron/root.crontab после загрузки всех пользовательских программ.
        Буду еще экспериментировать, но увы, с моим уровнем знаний причину я вряд ли найду.

      • Roman_V_M

        Тут «начальник транспортного цеха» пишет, что стартовый скрипт Трансмишина может гадить.

  • MEDBEDb

    Есть способ проще для организации автоматического запуска процессов, для этого необходимо добавить в оригинальное расписания 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.

2010–2017 © NMT-200 ЧаВо