我做了一些搜索,没有看到任何类似的问题。
我有一个应该每五分钟运行一次的工作。
一次应该只运行一项作业。
如果程序运行时间超过 5 分钟,则应立即重新启动,而不是等待。
大多数情况下,工作会在一分钟内完成,偶尔它必须完成可能需要长达 20 分钟的事情。
我目前将此作业作为 systemd 服务运行,该作业是一个 shell 脚本,它在循环中调用实际程序,并在迭代之间休眠(5 分钟 - 上次运行时间)。它工作得很好。
#!/bin/sh
#
# Sample executable repeat-loop
#
# Run my job in a loop. If it takes less than max_delay seconds
# to run, sleep until it's time to repeat. If, for some reason, it took longer, just start
# over again immediately.
max_delay=300 # maximum delay between runs
# Don't allow multiple copies of this script to run
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@"
restart=0
now=0
while true ; do
now=`date -u '+%s'`
if [ $restart -gt $now ] ; then
sleep `expr $restart - $now`
fi
restart=`expr $now + ${max_delay}`
echo "my job runs here and may take between 30 seconds and 20 minutes to execute"
done
Run Code Online (Sandbox Code Playgroud)
由于我是一个该死的白痴,我认为将其更改为 oneshot 服务并启动 systemd 计时器会很棒。
我一直无法弄清楚如何使用OnUnitActiveSec或OnUnitInactiveSec...
OnUnitActiveSec将每 x 秒启动一次我的 oneshot 服务。
OnUnitInactiveSec将在上次 oneshot 终止后 x 秒启动我的 oneshot。
除了“嘿,你的 shell 脚本工作得很好,为什么用一匹死马打败自己?”之外还有什么想法吗?
我应该更好地测试,而不是依赖我对文档的(错误的)解释。
创建一个计时器文件并使用OnUnitActiveSec指向一个服务文件,Type=simple这正是我想要的。计时器将每 5 分钟调用一次,如果进程运行时间超过 5 分钟,它将(几乎)立即调用。它不会被双重调用。
使用simple而不是oneshot(根据文档)很重要。
| 归档时间: |
|
| 查看次数: |
4402 次 |
| 最近记录: |