systemd 计时器,用于每 5 分钟运行一次但可能运行时间超过 5 分钟的进程

systemd 计时器,用于每 5 分钟运行一次但可能运行时间超过 5 分钟的进程

我进行了一些搜索,没有看到任何类似的问题。

我有一份工作需要每五分钟运行一次。

每次只能运行一项作业。

如果程序运行时间超过 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

因为我是个白痴,所以我想将其改为一次性服务并让 systemd 计时器启动会很棒。

我还没能弄清楚如何使用OnUnitActiveSec或模拟这种行为OnUnitInactiveSec......

OnUnitActiveSec每隔 x 秒就会启动一次我的单次触发服务。 OnUnitInactiveSec将在上次单次触发终止后 x 秒启动我的单次触发服务。

除了“嘿,你的 shell 脚本运行得很好,为什么要自找麻烦?”之外还有什么想法吗?

答案1

我应该进行更好的测试,而不是依赖我对文档的(不正确的)解释。

创建一个计时器文件并OnUnitActiveSec指向一个服务文件,这Type=simple正是我想要的。计时器将每 5 分钟调用一次,如果进程运行时间超过 5 分钟,它将(几乎)立即被调用。它不会被重复调用。

使用simple而不是oneshot(根据文档)很重要。

相关内容