允许用户配置cron

时间:2009-07-16 08:25:32

标签: python bash cron

我在服务器上有这个bash脚本,每小时运行一次,通过cron。我非常高兴,但现在用户希望能够通过网络界面配置频率。

我不习惯以编程方式操作cron配置,但我不确定其他选项是否更好。

我看到它的方式,我可以:

  • 安排脚本每分钟运行一次并检查它是否真的应该“现在”运行
  • 完全放弃cron并使用自己的调度程序deamon。这可能意味着在python中重写脚本
  • ...或者从网络界面中操作cron配置(用python BTW编写)

我该怎么办?

编辑:澄清一下,我担心操纵cron的主要原因是因为它基本上是文本操作而没有验证,如果我搞砸了,我的其他任何cron作业都不会运行。

以下是我最终要做的事情:

根据stefanw的建议,我在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 个答案:

答案 0 :(得分:10)

为用户提供一些合理的选择,例如每分钟,每5分钟,每半小时......,并将这些值转换为cron作业字符串。这是用户友好的,并禁止用户直接篡改cron作业字符串。

答案 1 :(得分:3)

您可以使用python调度程序库来完成大部分工作:

答案 2 :(得分:0)

Webmin怎么样?我自己从未使用它,但似乎你可以配置cron模块并为想要配置作业的用户授予权限。

答案 3 :(得分:0)

我使用的是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

[...]

答案 4 :(得分:0)

我找到了一个可以为我操纵cron信息的模块。它被称为python-crontab,它可以与easy_install一起使用。来自source

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的调度程序。