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

我做了一些search,没有看到类似的问题。

我有一份工作应该每五分钟运行一次。

一次只能有一份工作。

如果程序运行超过5分钟,应立即重新启动,而不是等待。

大多数时候,这项工作将在一分钟内完成,偶尔也要做20分钟的事情。

我目前以systemd服务运行这个工作,而这个工作是一个shell脚本,它在一个循环中调用实际的程序,并在迭代(5分钟 – 上次运行时间)之间hibernate。 它工作很好。

#!/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 

因为我是一个stream氓白痴,所以我觉得把这个改成一个单一的服务是非常好的,并且让systemd定时器开始工作。

我一直无法弄清楚如何使用OnUnitActiveSecOnUnitInactiveSec模拟此行为…

OnUnitActiveSec将每x秒启动我的OnUnitActiveSec服务。 OnUnitInactiveSec将在最后一次singlehot结束后的x秒钟之后启动我的OnUnitInactiveSec

除了“嘿,你的shell脚本很好,为什么用一匹死马打败你自己”呢?

我应该更好地testing,而不是依赖于我对文档的(不正确)解释。

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

使用simple而非oneshot (每个文档)非常重要。