【问题标题】:Edit crontab programmatically and force the daemon to refresh以编程方式编辑 crontab 并强制守护程序刷新
【发布时间】:2009-11-04 11:14:54
【问题描述】:

我正在尝试使用出色的 CronEdit gem 在 Ruby 中为 Crontab 编写 Web 前端。我浏览了 Dillon Cron 的 crontab 源代码,发现它更新了一个特定的文件,以便守护程序在下一次扫描期间刷新 cron 列表。

在 VixieCron 的 man crontab 中,它说:

此外,cron 每分钟检查一次以查看其假脱机目录的 modtime (或 /etc/crontab 上的 modtime)已更改,如果已更改,则 cron 将 检查所有 crontab 上的 modtime 并重新加载已更改的那些。 因此,只要修改了 crontab 文件,就不需要重新启动 cron。注意 crontab(1) 命令更新 spool 目录的 modtime 更改 crontab。

是否有任何独立于平台(Ubuntu、Red Hat、ArchLinux、Mac OS X)的方式来确保在手动编辑 Cron 文件后,守护进程不会失败地刷新它?

【问题讨论】:

    标签: ruby linux cron sysadmin crontab


    【解决方案1】:

    不,没有。如果您知道它是 VixieCron,则更新目录的时间戳。否则,您可能会伪造它:在调用 crontab -e 之前设置环境变量 EDITOR(这应该会为 crontab 提供一个编辑器)。

    这个想法是将编辑器设置为一些进行更改的程序。 crontab -e 将等待编辑器终止并重新读取文件并告诉 cron 发生了一些变化。

    但是,如果您有旧版本的 cron,您仍必须重新启动它。但我怀疑你是否能在任何运行 Linux 或 Mac OS X 的设备上找到如此古老的版本。

    【讨论】:

    • 嗯,不,但我认为大多数 crontab 实现都支持通过 crontab(8) 命令进行原子更新,所以你可以这样做:crontab -l > CT,编辑 CT,crontab CT 和您不必担心时间戳等。或者crontab - 并在 STDIN 上提供更新的选项卡。
    【解决方案2】:

    Sane 的现代 Linux 发行版具有 /etc/cron.d/ 目录,您可以在其中将 crontab 条目作为单独的文件放置。如果我没记错的话,新的 cronfile 会在写入后 2 分钟内被读取

    【讨论】:

      【解决方案3】:

      非常感谢 gnibbler 和 Aaron。我刚刚浏览了 Ruby 的 'whenever' 和 'cronedit' gems 的源代码。他们都做了一个“crontab -”,用更新的 cron 条目替换现有的 cron 文件。这意味着与我最初的问题相反,这些库使用标准 crontab 工具,该工具反过来会执行刷新守护程序所需的任何细节。

      我认为刷新守护程序的最佳独立于平台且与 cron(dillon、vixie、mcron 等)无关的方法是始终使用相关的 crontab 实用程序。即使以编程方式进行编辑,用户程序也必须将新的 cron 文件传递​​给 crontab 实用程序,该实用程序将执行该特定平台/cron 所需的任何操作。

      @Mark,感谢 cmets。但是,我正在尝试提供一个简单的 Web 前端,用户可以通过 www 进行自定义,就像直接编辑 crontab 文件一样。

      非常感谢您的回复!

      【讨论】:

      • 哦。我刚刚写了另一条评论说同样的话。在发布之前应该阅读所有答案:)
      【解决方案4】:

      如果这很重要,为什么不使用不同的杠杆呢?换句话说,有两种选择:

      crontab 1: /do/some/very/specific/thing with specific parameters that I need to change etc.

      crontab 2:/do/what/needs/to/be/done

      在#2 中,作业负责在运行时确定需要做什么并执行它。有了这种设计,需要了解 crontab 如何在某个详细级别上工作的概念是无关紧要的。

      【讨论】:

        猜你喜欢
        • 2015-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 2013-03-10
        • 2014-11-28
        • 2014-01-25
        • 1970-01-01
        相关资源
        最近更新 更多