我需要每 64 小时运行一次脚本。我找不到答案cron
。是否可以使用它,或者我应该在 shell 脚本中使用循环?
答案1
只需每小时运行一次,并检查自某个任意时刻(例如 Unix 纪元时间的时刻 0)以来的小时数是否为 64 的倍数:
0 * * * * t=$(date +\%s); [ "$(( (t / 3600) \% 64 ))" -eq 0 ] && your-command
答案2
我建议也许使用 crontab“前端”,例如crontab大师如果您是初学者,请了解 crontab。
但是,正如您的情况一样,小时设置仅允许 0 到 23 之间的值,因此您不能在此处使用 crontab。
相反,我建议使用at
.在你的情况下,我可能会使用类似的东西:
at now + 64 hours
然后输入您的命令或
echo "<your command>" | at now + 64 hours
基本上,您将安排在上次调用该命令时立即运行该命令。另外,如果您不需要时间增量,而是想要确切的时间,我建议做一些时间算术,然后使用精确的时间来at
运行命令。
我强烈建议阅读的手册页at
,因为它相当全面。
答案3
cron
用于按日期或时钟事件运行,即每月或每周的第一天或每天的每三个小时。
对于不能简单地用时钟时间或日期算术来表示的时间间隔运行的东西,我建议使用计时器systemd
- 当然,只有当您systemd
在各自的设备上运行时,它才有效。
您将需要两个文件:用于运行脚本的服务文件和用于管理事件的计时器文件。
$cat /etc/systemd/system/myscript.service
[Unit]
Description=this service runs my script
[Service]
ExecStart=/full/path/to/myscript.sh
#[Install]
#WantedBy=multi-user.target
该服务只是执行脚本而不检查它是否成功或其他任何事情。可以选择启用该服务,systemctl enable myscript.service
这意味着它将在启动时执行一次 - 我对此进行了注释,因为计时器将处理启动事件。您可以通过手动运行脚本systemctl start myscript.service
。
$cat /etc/systemd/system/myscript.timer
[Unit]
Description=this timer runs myscript.service every 64h
[Timer]
OnBootSec=120
OnUnitActiveSec=64h
[Install]
WantedBy=timers.target
myscript.service
这是自上次激活服务以来每 64 小时运行一次的计时器,以及启动后两分钟运行一次的计时器(以确保系统处于服务运行的正确状态)。请注意,计时器将不是如果您重新启动/关闭电源,请记住 64 小时。相应地启用并启动计时器:
systemctl enable myscript.timer
systemctl start myscript.timer
由于计时器仅在启动后或自上次单元激活后启动,因此您必须运行该服务一次以确保计时器运行:
systemctl start myscript.service
通过以下方式检查计时器的状态
systemctl list-timers
答案4
令人惊讶的是没有人提到以下任何一项:-
阿纳克朗
它是大多数发行版的标准配置。