Cron 作业——每 5 秒运行一次

Posted

技术标签:

【中文标题】Cron 作业——每 5 秒运行一次【英文标题】:Cron jobs -- to run every 5 seconds 【发布时间】:2011-03-20 21:10:51 【问题描述】:

我想创建每 5 秒运行一次脚本的 cron 作业。看到 cron 作业只允许 0-59 分钟的增量,依此类推。

我想创建另一个脚本来调用下面编写的原始脚本。

#!/bin/bash

while true
do
# script in the same directory as this script. is this correct?
bash makemehappy.sh
sleep 1
done

现在,我需要知道如何在每次启动计算机时运行此脚本,并且如果由于某种原因它没有运行,它会自行启动。

我也知道每分钟运行这个脚本并不是一件好事。 :)

如果有更简单的方法可以每 5 秒运行一次脚本,请告知。

请,谢谢。

【问题讨论】:

尝试每 5 秒做一件事真的是解决问题的最佳方法吗? Running a cron every 30 seconds的可能重复 【参考方案1】:

我不会为此使用 cron。我会使用那个 bash 脚本(使用绝对路径,除非你希望它是可移植的并且知道目录结构将被保留)。

相反,我只想sleep 5,就像你做的那样(只有 5 秒而不是 1 秒)。

就从您的系统启动它而言,这取决于系统。在(某些)Linux 发行版上,有一个名为 /etc/rc.local 的文件,您可以在其中添加要在系统启动时运行的脚本。嗯......我不应该这么笼统,我使用的发行版有这个。如果您运行的是 Ubuntu,则不再有 inittab,它们使用的是新贵,顺便说一句。

因此,如果您有一个无限循环并且在/etc/rc.local 中有一个条目,那么您应该让它无休止地运行(或者直到它遇到问题并退出)。

【讨论】:

我的发行版是 ubuntu?我似乎在 etc 目录中找不到该 rc.local 文件。建议? 什么版本? (cat /etc/issue) 10.04 我设法弄明白了。 :) 通过将其添加到 init.d 并更新 update-rc.d 不错!希望对你有用。 (如果对您有帮助,有机会选择我的答案吗?不是要粗鲁,我只是想建立我的代表,哈哈) 请注意,sleep 5 并不能保证您的代码每 5 秒准确执行一次,只是保证后续执行之间至少间隔 5 秒。【参考方案2】:

尝试使用 anacron,或者更好的是,在计算机启动时启动 init 脚本。

如果您希望脚本“自行重新启动”,则需要每隔几分钟运行一次以检查原始脚本是否仍在运行。这可以在 inittab (/etc/inittab) 中完成,或者在 Ubuntu 上,/etc/event.d。试试man 5 inittab,看看“重生”选项。

【讨论】:

【参考方案3】:

一些crons 有一个@reboot 时间说明符(这涵盖了所有时间和日期字段)。如果你的,你可以使用它。如果这是一个“系统”服务(而不是为自己运行的东西),那么这里的其他解决方案可能会更好。

【讨论】:

【参考方案4】:

初始化脚本在启动时很好,但不检测进程是否失败并且必须重新启动。 supervisord 在检测失败的进程并重新启动它们方面做得很好。我会推荐一个像@Tim 描述的带有 5 秒循环的脚本,但是将supervisord 包裹在它周围以确保它继续运行。

【讨论】:

【参考方案5】:

正如my answer to a similar question 中详细解释的那样,您可以使用 SystemD 计时器单元进行任何您想要的时间表 - 理论上可以达到 1 纳秒的时间表没有sleep kludges

快速概览:

    设置 SystemD 服务以运行您想要的 - 这可以很简单:

/home/myusuf3/.config/systemd/user/makemehappy.service

[Unit]
Description=Make me happy
[Service]
ExecStart=/home/myusuf3/.local/bin/makemehappy.sh
    使用您想要的时间表设置 SystemD 计时器,如 man systemd.timer 中所述:

/home/myusuf3/.config/systemd/user/makemehappy.timer

[Unit]
Description=Schedule to make me happy
[Timer]
OnBootSec=5
OnUnitActiveSec=5
AccuracySec=1
    启用和启动计时器:

systemctl --user daemon-reload
systemctl --user enable makemehappy.timer
systemctl --user start makemehappy.timer

(启用后,每次启动计算机时它都会自动启动,但您可能还是想现在启动它)。

【讨论】:

【参考方案6】:

要回答标题中的问题,这是如何每 5 秒运行一次 cronjob:

* * * * * /path/to/script.sh
* * * * * sleep 5 && /path/to/script.sh
* * * * * sleep 10 && /path/to/script.sh
* * * * * sleep 15 && /path/to/script.sh
* * * * * sleep 20 && /path/to/script.sh
* * * * * sleep 25 && /path/to/script.sh
* * * * * sleep 30 && /path/to/script.sh
* * * * * sleep 35 && /path/to/script.sh
* * * * * sleep 40 && /path/to/script.sh
* * * * * sleep 45 && /path/to/script.sh
* * * * * sleep 50 && /path/to/script.sh
* * * * * sleep 55 && /path/to/script.sh

它并不漂亮,但这个解决方案没有额外的工具或依赖项。因此,如果您有工作的 cron 作业,这应该可以立即工作。

【讨论】:

以上是关于Cron 作业——每 5 秒运行一次的主要内容,如果未能解决你的问题,请参考以下文章

每 30 秒运行一次 cron 作业的最佳方式是啥? [复制]

使用 Node-Cron 每 10 秒执行一次 Cron 作业

node-cron 每 3 小时运行一次作业

Laravel 5 每 30 秒安排一次作业

为什么这个cron作业每分钟运行一次?

如何从 0 分钟以外的时间开始每 5 分钟运行一次 cron 作业?