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

chr*_*onn 2 cron

我的 crontab 中有以下内容

15 */4 * * * ...

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

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

有没有办法可以实现前者而不是后者?

ste*_*ver 6

在当前的 Ubuntu 系统上使用systemd 计时器可以更轻松地完成此操作。

按照archlinux wiki中的单调计时器示例:

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

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

    [Unit]
    Description=Run foo on boot and every 4 hours thereafter
    
    [Timer]
    OnBootSec=0
    OnUnitActiveSec=4h
    
    [Install]
    WantedBy=timers.target
    
    Run Code Online (Sandbox Code Playgroud)
  3. 启用定时器

    sudo systemctl enable foo.timer
    
    Run Code Online (Sandbox Code Playgroud)

重新启动后,您应该能够看到新计时器及其上次和下次激活时间:

$ 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.
Run Code Online (Sandbox Code Playgroud)