Выполняйте скрипт bash каждые 10 секунд между определенными часами - PullRequest
1 голос
/ 23 февраля 2020

У меня есть скрипт, который запускается каждые 5 секунд. Возможно ли запустить этот скрипт, например, между CET 08:00 - 12:00?

Я думал, что смогу сделать это с помощью cron, но, к сожалению, у этого есть минимум 1 минута. Поэтому я думал о создании задания cron, которое запускает сценарий в 08:00, а затем убивает его в 12:00, я полагаю, что это лучшее решение.

У кого-нибудь есть входные данные?

    #!/bin/bash

while true; do
    python3 script.py
    sleep 5;
done

Ответы [ 2 ]

3 голосов
/ 24 февраля 2020

Как указывает Wiimm , его ответ охватывает только «запустить скрипт, подождать 10 секунд и повторить, с 8:00 до 12:00».

Есть несколько подходов, о которых я могу подумать:

A. запустить скрипт в 8:00 в cron и проверить, когда пора заканчивать sh

#!/bin/sh

END=$(date -d "12:00" +"%H * 60 + %M" | bc)

while [ $(date +"%H * 60 + %M" | bc) -lt $END ]; do
    date >> /tmp/log.txt # replace this with your script 
    sleep 10
done

Объяснение:

  • date +"%H * 60 + %M" | bc вычисляет минуты со дня начал. Примечание: b c используется здесь для обработки ведущих нулей $(( $(date +"%H * 60 + %M") )) выдаст ошибку.
  • [ $(date +"%H * 60 + %M" | bc) -lt $END ] - сравнивается со временем до конца

B. запустите его из cron и используйте обработчик сигнала для обработки изящного выхода, используйте cron для его завершения.

#!/bin/bash

echo $$ > /tmp/pid.txt
EXIT=
trap "echo 'Exiting' >> /tmp/log.txt; EXIT=yes" TERM

while [[ -z "$EXIT" ]]; do
    date >> /tmp/log.txt # replace this with your script
    sleep 10
done

crontab будет выглядеть так:

00 08 * * * /path/to/wrappers/script.sh
00 12 * * * kill $(cat /tmp/pid.txt)

Объяснение:

  • echo $$ > /tmp/pid.txt - сохраняет pid (вам, вероятно, следует выбрать другое место, подходящее для вашей системы)
  • trap "echo 'Exiting' >> /tmp/log.txt; EXIT=yes" TERM - при этом будет запускаться echo 'Exiting' >> /tmp/log.txt; EXIT=yes при получении сигнала TERM ( TERM - это сигнал по умолчанию, отправляемый командой kill).
  • while [[ -z "$EXIT" ]]; do - повторите, пока EXIT пуст
  • . Преимущество заключается в возможности корректного завершения работы скрипта при необходимости, а не только в 12:00.

Примечание : комбинация обоих будет, вероятно, лучшим подходом.

Также : см. { ссылка } - подробно описано, как запустить это через SystemD, но он будет запускать скрипт каждые 10 секунд, даже если предыдущий скрипт не ' конец (если я правильно понимаю ответ, я не знаком с SystemD)

1 голос
/ 24 февраля 2020

В дополнение к решению Сорина.

while true; do
  do_something 
  sleep 10
done

Здесь задание do_something выполняется (!) Не каждые 10 секунд, а выполняется каждые 10 секунд плюс время, необходимое для выполнения do_something , Таким образом, альтернатива:

while true; do
  sleep $((10-$(date +%s)%10))
  do_something 
done

Здесь задание do_something выполняется каждый раз, когда секундами является одно из 0, 10, 20, 30, 40 или 50. Единственная ловушка: Если do_something работает в режиме более 10 секунд, по крайней мере одно выполнение пропускается.

Объяснение моего сна:

DELAY=10
sleep $(( DELAY- $(date +%s) % DELAY))

$((...)) входит в математический режим. $(date +%s) возвращает общее количество секунд с начала эпохи. % DELAY является операцией по модулю, так что результат находится между 0 и исключает ЗАДЕРЖКУ (0..9 в этом примере). DELAY- гарантирует, что время сна составляет не менее 1 секунды.

...