使用systemd-run创建临时服务和定时任务

发现了神器systemd-run, 可以用来创建临时的服务和定时任务

目前在 wg-ops 中使用此命令创建定时任务进行DNS查询, 命令格式如下:

systemd-run -u <name> --collect --timer-property AccuracySec=10 --on-calendar *:*:0/30 <cmd>

-u 用来指定服务名称. name.timername.service会被创建出来. 如果不指定这个那么systemd-run会自动生成一个ID. 可以从命令执行的输出中拿到ID.

--collect 无论任务是否成功都销毁临时服务与定时器.

--timer-property 用来指定定时任务的属性. 其中AccuracySec=用于指示systemd多久检查一次任务触发时间.

--on-calendar 用来指定触发周期. *:*:0/30 表示每分钟0秒和30秒分别触发一次. 这个表达形式和cron有点不一样, 但是看起来稍微清晰一些. 奇怪的是没找到每隔30秒运行一次的选项. 尝试使用了OnActiveSec=也不管用, timer执行一次之后就消失了.

因为是临时任务, 所以如果执行完成会被systemd回收. 使用systemctl stop停止时也会被systemd回收. 如果不加--collect, 若服务执行失败会保留. 这种情况下可以用systemctl reset-failed手动改掉失败状态, 就会被systemd回收了.

参考

systemd-run — Run programs in transient scope units, service units, or path-, socket-, or timer-triggered service units

systemd.timer — Timer unit configuration

systemd/Timers - ArchWiki

What Settings Are Currently Available For Transient Units?