【问题标题】:Allowing user to configure cron允许用户配置 cron
【发布时间】:2010-11-11 07:01:05
【问题描述】:

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

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

在我看来,我可以:

  • 安排一个脚本每分钟运行一次,并检查它是否真的应该“现在”运行
  • 完全放弃 cron 并使用作为其自己的调度程序的守护程序。这可能意味着用python重写脚本
  • ...或者吸收它并从 Web 界面操作 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

我不喜欢它,但它似乎是最好的选择。

【问题讨论】:

    标签: python bash cron


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      Webmin 呢?我自己从未使用过它,但您似乎可以配置 cron 模块并向想要配置作业的用户授予权限。

      【讨论】:

      • 恐怕这有点矫枉过正
      • 是的,这是一个小问题的大解决方案。与“本土”的任何东西相比,它的设置和维护可能仍然更快。当然,这在很大程度上取决于您当前的环境。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        嗯,我使用的是一个由 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
        
        [...]
        

        【讨论】:

        • 但是现在我还是得按计划创建那些标签文件,不是吗?
        • 是的。但现在您不必操作 cron 文件,也不必使用您选择的语言做复杂的事情。您只需要创建/删除文件。您从应用程序中去关联调度程序作业。
        【解决方案5】:

        我找到了一个可以为我操作 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 的调度程序。

        【讨论】:

          猜你喜欢
          • 2017-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-15
          • 1970-01-01
          • 2023-04-03
          • 2021-06-22
          相关资源
          最近更新 更多