Ответ 1
1-56/5 * * * * /my/script
Это должно работать на vixiecron, я не уверен в других реализациях.
Я знаю, что я могу что-то запустить каждые пять минут в 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
И добавьте это в начало своего 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
edit: эти типы таймеров не будут сохраняться при перезагрузке, если вы хотите, чтобы они создали правильный файл службы, с соответствующей строкой oncalendar
Я бы создал новый script "delaystart", который занимает период сна как первый параметр, а script - как остальное. Я бы сделал script проверить линию crontab для строки с помощью script и только запустить script, если строка не закомментирована. Это делает его многоразовым, и ps не сообщает script как работающий, когда это действительно не так.
#!/bin/bash
sleeptime=$1
sleep ${sleeptime}
shift
if ( ! crontab -l | grep -e '#.+delaystart '${sleeptime} $* ) then
$*
fi
sean.bright шутка заставила меня думать... почему бы не использовать...
* * * * * /my/script
... и внутри 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... может быть, но такой же уродливый, как кронтаб... я не знаю.