У вас є */30
в хвилинах специфікаторів - це означає , що кожна хвилина , але з кроком 30 (іншими словами, кожні півгодини). Оскільки cron
не зводиться до підхвилинних резолюцій, вам потрібно буде знайти інший спосіб.
Однією можливістю, хоча це трохи невдало (a) , є два завдання, одне зміщення на 30 секунд:
# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )
Ви побачите, що я додав коментарі та відформатований, щоб забезпечити їх легке синхронізацію.
Обидві cron
роботи на самому ділі запустити кожну хвилину , але в останні один чекатиме півхвилини перед виконанням «м'яса» завдання, /path/to/executable
.
Інші cron
варіанти, що не базуються, дивіться тут інші відповіді, зокрема ті, що згадують fcron
та systemd
. Це, мабуть, краще, якщо ваша система має можливість їх використовувати (наприклад, встановити fcron
або мати в ній дистрибутив systemd
).
Якщо ви не хочете використовувати рішення kludgy, ви можете використовувати рішення на основі циклу з невеликою модифікацією. Вам все одно доведеться керувати тим, щоб ваш процес працював у певній формі, але після сортування цей сценарій повинен працювати:
#!/bin/env bash
# Debug code to start on minute boundary and to
# gradually increase maximum payload duration to
# see what happens when the payload exceeds 30 seconds.
((maxtime = 20))
while [[ "$(date +%S)" != "00" ]]; do true; done
while true; do
# Start a background timer BEFORE the payload runs.
sleep 30 &
# Execute the payload, some random duration up to the limit.
# Extra blank line if excess payload.
((delay = RANDOM % maxtime + 1))
((maxtime += 1))
echo "$(date) Sleeping for ${delay} seconds (max ${maxtime})."
[[ ${delay} -gt 30 ]] && echo
sleep ${delay}
# Wait for timer to finish before next cycle.
wait
done
Хитрість полягає в тому, щоб використовувати, sleep 30
але запускати його у фоновому режимі, перш ніж ваша корисна навантаження працює. Потім, після закінчення корисного навантаження, просто зачекайте, коли фон sleep
закінчиться.
Якщо корисне навантаження займає n
секунди (де n <= 30
), очікування після корисного навантаження буде 30 - n
секундами. Якщо це займе більше 30 секунд, наступний цикл буде відкладений до закінчення корисного навантаження, але більше.
Ви побачите, що у мене є код налагодження, щоб запуститися на однохвилинній межі, щоб зробити вихідний вихід спочатку простішим. Я також поступово збільшую максимальний час корисного навантаження, щоб ви, зрештою, побачили, що корисне навантаження перевищує тривалість циклу 30 секунд (виводиться додатковий порожній рядок, щоб ефект був очевидним).
Наступний запуск зразка (коли цикли зазвичай починаються через 30 секунд після попереднього циклу):
Tue May 26 20:56:00 AWST 2020 Sleeping for 9 seconds (max 21).
Tue May 26 20:56:30 AWST 2020 Sleeping for 19 seconds (max 22).
Tue May 26 20:57:00 AWST 2020 Sleeping for 9 seconds (max 23).
Tue May 26 20:57:30 AWST 2020 Sleeping for 7 seconds (max 24).
Tue May 26 20:58:00 AWST 2020 Sleeping for 2 seconds (max 25).
Tue May 26 20:58:30 AWST 2020 Sleeping for 8 seconds (max 26).
Tue May 26 20:59:00 AWST 2020 Sleeping for 20 seconds (max 27).
Tue May 26 20:59:30 AWST 2020 Sleeping for 25 seconds (max 28).
Tue May 26 21:00:00 AWST 2020 Sleeping for 5 seconds (max 29).
Tue May 26 21:00:30 AWST 2020 Sleeping for 6 seconds (max 30).
Tue May 26 21:01:00 AWST 2020 Sleeping for 27 seconds (max 31).
Tue May 26 21:01:30 AWST 2020 Sleeping for 25 seconds (max 32).
Tue May 26 21:02:00 AWST 2020 Sleeping for 15 seconds (max 33).
Tue May 26 21:02:30 AWST 2020 Sleeping for 10 seconds (max 34).
Tue May 26 21:03:00 AWST 2020 Sleeping for 5 seconds (max 35).
Tue May 26 21:03:30 AWST 2020 Sleeping for 35 seconds (max 36).
Tue May 26 21:04:05 AWST 2020 Sleeping for 2 seconds (max 37).
Tue May 26 21:04:35 AWST 2020 Sleeping for 20 seconds (max 38).
Tue May 26 21:05:05 AWST 2020 Sleeping for 22 seconds (max 39).
Tue May 26 21:05:35 AWST 2020 Sleeping for 18 seconds (max 40).
Tue May 26 21:06:05 AWST 2020 Sleeping for 33 seconds (max 41).
Tue May 26 21:06:38 AWST 2020 Sleeping for 31 seconds (max 42).
Tue May 26 21:07:09 AWST 2020 Sleeping for 6 seconds (max 43).
Якщо ви хочете уникнути хитрого рішення, це, мабуть, краще. Вам все одно знадобиться cron
робота (або еквівалент), щоб періодично визначати, чи працює цей скрипт, і, якщо ні, запускати його. Але сам сценарій потім обробляє терміни.
(a) Дехто з моїх товаришів по роботі сказав би, що мої особливості :-)