我想在每个月的最后一天运行一个服务文件。如何配置这个?我指的是系统定时器但无法找到正确的方法。
此外,是否可以添加另一个配置以在该月的最后一个工作日运行? (除星期日和星期六以外的日子)
答案1
从版本 233 开始,systemd 支持在其日历语法中使用“~”来指定相对于月底的日期。
OnCalendar=*-02~03
指二月的倒数第三天(26 日或 27 日,取决于是否是闰年)
Mon *-05~07/1
和Mon *-05~01..07
是五月最后一个星期一的同义词。
答案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 ]]