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】:一些cron
s 有一个@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 作业的最佳方式是啥? [复制]