Jak sprawić, by cron uruchamiał coś co " N " tej minuty, gdzie n % 5 = = 1?

Wiem, że mogę mieć coś uruchamianego co 5 minut w cron Z linijką w stylu:

 */5 * * * * /my/script

A co jeśli nie chcę, żeby to działało na 12:00, 12:05, 12:10, ale raczej w 12:01, 12:06, 12:11, itd? Chyba dam radę:

 1,6,11,16,21,26,31,36,41,46,51,56 * * * * /my/script

...ale to brzydkie. Czy jest na to bardziej elegancki sposób?

Author: Jon Ericson, 2009-01-23

5 answers

1-56/5 * * * * /my/script

To powinno działać na vixiecron, nie jestem pewien co do innych implementacji.

 76
Author: David Z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 22:57:48

Użyj pierwszego harmonogramu:

*/5 * * * * /my/script

I dodaj to do początku skryptu:

sleep 60

(Tak, to żart)

 17
Author: Sean Bright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 22:15:09

Jest to dość stary temat, jednak ponieważ minęło tyle czasu, jest jeszcze kilka innych opcji. Jednym z nich jest nieużywanie crona w ogóle i używanie timerów systemd. Korzystanie z nich daje większą ziarnistość niż sekundy wraz z wieloma innymi opcjami

Więcej informacji można znaleźć tutaj https://wiki.archlinux.org/index.php/Systemd/Timers

Np do uruchomienia polecenia 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: tego typu timery nie będą się utrzymywać po ponownym uruchomieniu, jeśli chcesz, aby na pewno wygenerujesz odpowiedni plik serwisowy z odpowiednią linią oncalendar

 0
Author: krad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-25 10:29:01

Stworzyłbym nowy skrypt "delaystart", który jako pierwszy parametr przyjmuje okres uśpienia, a skrypt uruchamia się jako reszta. Chciałbym skrypt sprawdzić linię crontab dla linii ze skryptem i tylko uruchomić skrypt, jeśli linia nie jest komentowany. To sprawia, że jest wielokrotnego użytku, A ps nie zgłosi, że skrypt jest uruchomiony, gdy tak naprawdę nie jest.]}

#!/bin/bash
sleeptime=$1
sleep ${sleeptime}
shift
if ( ! crontab -l | grep -e '#.+delaystart '${sleeptime} $* ) then
  $*
fi
 -1
Author: Ludvig A. Norin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-24 21:32:37

Sean.dowcip Brighta dał mi do myślenia... dlaczego nie używać...

* * * * * /my/script

...i w skrypcie zrób to...

#!/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... może, ale tak brzydki jak crontab... Nie wiem.

 -5
Author: dacracot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 22:51:23