Как заставить cron запускать что-то каждую "N" -ю минуту, где n% 5 == 1? - PullRequest
44 голосов
/ 23 января 2009

Я знаю, что я могу запускать что-то каждые пять минут в 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

... но это безобразно. Есть ли более элегантный способ сделать это?

Ответы [ 5 ]

77 голосов
/ 23 января 2009
1-56/5 * * * * /my/script

Это должно работать на vixiecron, я не уверен насчет других реализаций.

17 голосов
/ 23 января 2009

Используйте ваше первое расписание:

*/5 * * * * /my/script

И добавьте это в начало вашего скрипта:

sleep 60

(Да, это шутка)

0 голосов
/ 25 октября 2017

Это довольно старая тема, однако, так как прошло много времени, есть несколько других вариантов. Один из них - не использовать cron вообще, а использовать системные таймеры. Используя их, вы получаете более высокую степень детализации, чем секунды, а также множество других опций

Более подробная информация доступна здесь 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

0 голосов
/ 25 сентября 2009

Я бы создал новый скрипт "delaystart", который принимает период ожидания в качестве первого параметра и скрипт для запуска в качестве остальных. Я заставил бы скрипт проверять строку crontab для строки со сценарием и запускать сценарий, только если строка не закомментирована. Это делает его пригодным для повторного использования, и ps не будет сообщать, что скрипт запущен, хотя на самом деле это не так.

#!/bin/bash
sleeptime=$1
sleep ${sleeptime}
shift
if ( ! crontab -l | grep -e '#.+delaystart '${sleeptime} $* ) then
  $*
fi
0 голосов
/ 23 января 2009

шутка Шона. Брайта заставила меня задуматься ... почему бы не использовать ...

* * * * * /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"

... Кладж ... может быть, но так же уродливо, как crontab ... Я не знаю.

...