我知道我可以在 cron 中每五分钟运行一次,如下所示:
*/5 * * * * /my/script
如果我不想让它在 12:00、12:05、12:10 运行,而是在 12:01、12:06、12:11 等运行,该怎么办?我想我可以这样做:
1,6,11,16,21,26,31,36,41,46,51,56 * * * * /my/script
......但这很丑陋。有没有更优雅的方法来做到这一点?
1-56/5 * * * * /my/script
这应该适用于 vixiecron,我不确定其他实现。
使用您的第一个时间表:
*/5 * * * * /my/script
并将其添加到脚本的开头:
sleep 60
(是的,这是个笑话)
这是一个相当古老的话题,但是随着时间的流逝,现在还有其他一些选择。其中之一是根本不使用 cron,而使用 systemd 计时器。使用这些为您提供比秒更高的粒度以及许多其他选项
更多信息在这里https://wiki.archlinux.org/index.php/Systemd/Timers
例如运行临时命令
# systemd-run --on-calendar="*:1/5" /bin/touch /tmp/foo2
Running timer as unit run-r31335c4878f24f90b02c8ebed319ca60.timer.
Will run service as unit run-r31335c4878f24f90b02c8ebed319ca60.service.
# systemctl status run-r31335c4878f24f90b02c8ebed319ca60.timer
● run-r31335c4878f24f90b02c8ebed319ca60.timer - /bin/touch /tmp/foo2
Loaded: loaded
Transient: yes
Drop-In: /run/systemd/system/run-r31335c4878f24f90b02c8ebed319ca60.timer.d
└─50-Description.conf, 50-OnCalendar.conf, 50-RemainAfterElapse.conf
Active: active (waiting) since Wed 2017-10-25 09:05:13 UTC; 40s ago
# ls -l /tmp/foo*
-rw-r--r-- 1 root root 0 Oct 25 09:06 /tmp/foo2
# sleep 300; ls -l /tmp/foo*
-rw-r--r-- 1 root root 0 Oct 25 09:11 /tmp/foo2
# date; ls -l /tmp/foo2
Wed Oct 25 09:21:42 UTC 2017
-rw-r--r-- 1 root root 0 Oct 25 09:21 /tmp/foo2
编辑:这些类型的计时器不会在重新启动后持续存在,如果您希望它们确保生成正确的服务文件,以及相关的 oncalendar 行
我将创建一个新脚本“delaystart”,它将睡眠时间作为第一个参数,并将脚本作为其余参数运行。我会让脚本检查带有脚本的行的 crontab 行,并且仅在未注释掉该行时才启动脚本。这使得它可重用,并且 ps 不会在脚本确实没有运行时报告脚本正在运行。
#!/bin/bash
sleeptime=$1
sleep ${sleeptime}
shift
if ( ! crontab -l | grep -e '#.+delaystart '${sleeptime} $* ) then
$*
fi
sean.bright 的笑话让我开始思考……为什么不使用……
* * * * * /my/script
...并在脚本中执行此操作...
#!/bin/bash
export WHEN=`date '+%M'`
echo $WHEN
export DOIT=`echo "$WHEN % 5" | bc`
echo $DOIT
if [ $DOIT != 0 ] ; then
echo "ha ha ha"
fi
echo "done"
......一个kludge......也许,但像crontab一样丑陋......我不知道。