我做了一些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定时器开始工作。
我一直无法弄清楚如何使用OnUnitActiveSec或OnUnitInactiveSec模拟此行为…
OnUnitActiveSec将每x秒启动我的OnUnitActiveSec服务。 OnUnitInactiveSec将在最后一次singlehot结束后的x秒钟之后启动我的OnUnitInactiveSec 。
除了“嘿,你的shell脚本很好,为什么用一匹死马打败你自己”呢?
我应该更好地testing,而不是依赖于我对文档的(不正确)解释。
创build一个计时器文件,并使用指向一个Type=simple的服务文件的OnUnitActiveSec正是我想要的。 定时器将每5分钟调用一次,如果进程运行时间超过5分钟,将立即调用(几乎)。 它不会被双重调用。
使用simple而非oneshot (每个文档)非常重要。