crontab 每 x 小时运行一次 vs 当模数小时为零时运行

crontab 每 x 小时运行一次 vs 当模数小时为零时运行

我的 crontab 中有以下内容

15 */4 * * * ...

我原本的意图是,从计算机启动时起,每 4 小时运行一次 ...。如果我在上午 8 点开机,它将在 8、12、16、20 ... 运行;如果我在上午 9 点开机,它将在 9、13、17、21 ... 运行

我的观察是,crontab 似乎将小时除以 4,如果余数为 0,它就会执行。

有什么方法可以实现前者而不是后者?

答案1

在当前的 Ubuntu 系统上,使用systemd 定时器

单调计时器例如archlinux 维基

  1. 创建一个服务单元文件来将您的命令(/usr/local/bin/foo在此示例中)作为一次性服务运行

    [Unit]
    Description=do some stuff on schedule defined by foo.timer
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/foo
    
  2. 创建具有所需时间规范的相应计时器单元(启动后 0 秒,然后是服务单元最后一次激活后的 4 小时)

    [Unit]
    Description=Run foo on boot and every 4 hours thereafter
    
    [Timer]
    OnBootSec=0
    OnUnitActiveSec=4h
    
    [Install]
    WantedBy=timers.target
    
  3. 启用计时器

    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(如果运行所在的时区使用夏令时,则每年两次)或系统时钟进行时间调整时,这才会出现计划蠕变或非四小时性...

相关内容