如何配置 Systemd 计时器以在该月的最后一天运行服务

如何配置 Systemd 计时器以在该月的最后一天运行服务

我想在每个月的最后一天运行一个服务文件。如何配置这个?我指的是系统定时器但无法找到正确的方法。

此外,是否可以添加另一个配置以在该月的最后一个工作日运行? (除星期日和星期六以外的日子)

答案1

从版本 233 开始,systemd 支持在其日历语法中使用“~”来指定相对于月底的日期。

OnCalendar=*-02~03指二月的倒数第三天(26 日或 27 日,取决于是否是闰年)

Mon *-05~07/1Mon *-05~01..07是五月最后一个星期一的同义词。

https://github.com/systemd/systemd/blob/v233/NEWS#L174

答案2

最简单的解决方案可能是使用每天运行的计时器,并检查明天是否是该月的 1 号。就像是:

我的计时器.计时器:

[Unit]
Description=run mytimer.service daily at 6am
[Timer]
OnCalendar=6:00
Persistent=true
[Install]
WantedBy=timers.target

我的计时器服务:

[Unit]
Wants=mytimer.timer
Description=run on last day of month
[Service]
Type=oneshot
ExecStart=/bin/bash -c '[ $(date --date=tomorrow +%d) -eq 1 ] && \
                        /bin/myscript'

对于该月的最后一个工作日,我计算为:查看未来 3 天,检查日期是否是第 3 天且该天是周四到周一(含),还是日期是 1 日或第 2 天且该天是周一。使用日期和 %w 表示星期几(0=星期日)的等效 bash 测试将是

[[ $(date --date=+3days +%d%w) =~ 03[45601]|011|021 ]]

相关内容