Разрешение пользователю настраивать cron - PullRequest
3 голосов
/ 16 июля 2009

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

Мне неудобно манипулировать конфигурацией cron программно, но я не уверен, что другие варианты лучше.

Как я это вижу, я могу либо:

  • Запланируйте запуск сценария раз в минуту и ​​проверьте, действительно ли он запускается "сейчас"
  • Откажитесь от cron и используйте deamon, который является его собственным планировщиком. Это, вероятно, означает переписать скрипт на python
  • ... или смиритесь с этим и управляйте конфигурацией cron из веб-интерфейса (написано на python BTW)

Что мне делать?

РЕДАКТИРОВАТЬ: чтобы уточнить, главная причина, по которой я опасаюсь манипулировать cron, заключается в том, что в основном это манипулирование текстом без проверки, и если я испорчу его, ни одно из моих других заданий cron не запустится.

Вот что я в итоге сделал:

Следуя совету Стефанва, я добавил следующую строку вверху моего сценария bash:

if [ ! `cat /home/username/settings/run.freq` = $1 ]; then
    exit 0
fi

Я настроил следующие задания cron:

0 */2 * * *             /home/username/scripts/publish.sh 2_hours
@hourly                 /home/username/scripts/publish.sh 1_hour
*/30 * * * *            /home/username/scripts/publish.sh 30_minutes
*/10 * * * *            /home/username/scripts/publish.sh 10_minutes

В веб-интерфейсе я позволяю пользователю выбирать между этими четырьмя опциями, и в зависимости от того, что выбрал пользователь, я записываю строку 2_hours/1_hour/30_minutes/10_minutes в файл по адресу /home/username/settings/run.freq.

Мне это не нравится, но, похоже, лучшая альтернатива.

Ответы [ 5 ]

10 голосов
/ 16 июля 2009

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

3 голосов
/ 16 июля 2009

Вы можете использовать библиотеку планировщика Python, которая уже выполняет большую часть работы:

0 голосов
/ 20 июля 2009

Я нашел модуль, который может манипулировать информацией cron для меня. Он называется python-crontab и доступен с easy_install. Из источника :

Example Use:

from crontab import CronTab

tab = CronTab()
cron = tab.new(command='/usr/bin/echo')

cron.minute().during(5,50).every(5)
cron.hour().every(4)

cron2 = tab.new(command='/foo/bar',comment='SomeID')
cron2.every_reboot()

list = tab.find('bar')
cron3 = list[0]
cron3.clear()
cron3.minute().every(1)

print unicode(tab.render())

for cron4 in tab.find('echo'):
    print cron4

for cron5 in tab:
    print cron5

tab.remove_all('echo')

t.write()

(я продолжал поискать в поисках слова "cron" и ничего не мог найти. Мне не хватало ключевого слова "crontab").

Сейчас я решаю, буду ли я использовать это или просто полностью заменю cron на планировщик на основе Python.

0 голосов
/ 16 июля 2009

Хорошо, я использую основной скрипт, запускаемый cron каждую минуту. эта проверка скрипта коснулась файлов. Если файлы есть, основной скрипт cron запускает функцию / индекс. Вы просто должны прикоснуться к определенному файлу и "rm -f" отредактировать его, когда закончите. У этого есть побочные преимущества, чтобы быть более параллельным доказательством, если вы хотите другой способ начать работу. Затем вы можете использовать ваш любимый язык веб-программирования для планирования ваших пользователей ...

Основной скрипт выглядит так:

[...]

if [ -e "${tag_archive_log_files}" ]; then
    archive_log_files ${params}
    rm -f ${tag_archive_files}
fi

if [ -e "${tag_purge_log_files}" ]; then
    purge_log_files ${params}
    rm -f ${tag_purge_log_files}
fi

[...]
0 голосов
/ 16 июля 2009

А как насчет Webmin ? Я никогда не использовал его сам, но, кажется, вы можете настроить модуль cron и дать разрешения пользователю, который хочет настроить работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...