Как указывает 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)