我的 crontab 中有以下内容
15 */4 * * * ...
我原本的意图是,从计算机启动时起,每 4 小时运行一次 ...。如果我在上午 8 点开机,它将在 8、12、16、20 ... 运行;如果我在上午 9 点开机,它将在 9、13、17、21 ... 运行
我的观察是,crontab 似乎将小时除以 4,如果余数为 0,它就会执行。
有什么方法可以实现前者而不是后者?
答案1
在当前的 Ubuntu 系统上,使用systemd 定时器。
创建一个服务单元文件来将您的命令(
/usr/local/bin/foo
在此示例中)作为一次性服务运行[Unit] Description=do some stuff on schedule defined by foo.timer [Service] Type=oneshot ExecStart=/usr/local/bin/foo
创建具有所需时间规范的相应计时器单元(启动后 0 秒,然后是服务单元最后一次激活后的 4 小时)
[Unit] Description=Run foo on boot and every 4 hours thereafter [Timer] OnBootSec=0 OnUnitActiveSec=4h [Install] WantedBy=timers.target
启用计时器
sudo systemctl enable foo.timer
重启后,您应该能够看到新的计时器以及其上次和下次激活时间:
$ systemctl list-timers foo
NEXT LEFT LAST PASSED UNIT ACTIVATES
Thu 2023-01-12 19:37:39 EST 3h 58min left Thu 2023-01-12 15:37:39 EST 1min 5s ago foo.timer foo.service
1 timers listed.
Pass --all to see loaded but inactive timers, too.
答案2
后面的数字/
称为步长值,它开始每小时计数一次,持续00
数小时23
......所以:
15 */4 * * * ...
翻译为从小时开始,每 4 小时 15 分00
...不是重新启动。
你可能想要:
@reboot sleep 4h ...
即在系统启动后等待 4 小时,然后运行该命令...但是,每次重启后该命令只会运行一次...要继续在每次重启后每 4 小时运行一次命令直到关机,那么您可以将命令添加到脚本文件中,如下所示:
#!/bin/bash
while true; do
# command/s here will first run immediately after boot
sleep 4h
# command/s here will first run 4 hours after boot
done
然后在 crontab 行中使用该脚本文件,如下所示:
@reboot /bin/bash /full/path/to/scriptfile
答案3
您是否考虑过使用 at 作为调度程序?
在启动时,运行一个脚本,该脚本在四小时后安排一个“at”作业,并将其运行的时间传递给 at 作业可以读取的某些内容(例如某个地方的文件,例如在 at 作业本身内,例如传递给“at”作业的参数,有很多方法可以传递参数)。
当“at”作业运行时,在脚本运行的某个时刻,它会在启动后 4 小时安排另一个“at”作业。只有在系统时钟进入或退出 DST(如果运行所在的时区使用夏令时,则每年两次)或系统时钟进行时间调整时,这才会出现计划蠕变或非四小时性...