[英]How do I make cron run something every “N”th minute, where n % 5 == 1?
我知道我可以在cron中每五分鍾運行一次,如下所示:
*/5 * * * * /my/script
如果我不希望它在12點,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
例如,運行adhoc命令
# 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一樣難看......我不知道。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.