Cron - это планировщик заданий, который имеет минимальное разрешение в одну минуту. Если вам нужно более точное разрешение, чем это, вам нужно либо найти другой инструмент планирования, либо свернуть свой собственный.
Один, который я использовал в прошлом, выглядит следующим образом. Вы настраиваете желаемый промежуток и минимальный промежуток, и следующий скрипт будет выполнять вашу полезную нагрузку каждые N
секунды. Обратите внимание, что это не упрощенный планировщик «ожидания N
секунд между каждой итерацией». Фактически он начинает следующую итерацию N
секунд после начала предыдущего, а не после его окончания.
Минимальный интервал существует, поэтому, если ваша полезная нагрузка занимает более N
секунд, она не будет работать непрерывно. Если вы do хотите, чтобы он работал непрерывно в этой ситуации, просто установите минимальный разрыв на 0.
Код для этого здесь:
#!/usr/bin/bash
payload() {
if [[ $1 -eq 1 ]] ; then
echo "Sleeping for 1 second at $(date +%H:%M:%S)."
else
if [[ $1 -lt 10 ]] ; then
echo "Sleeping for $1 seconds at $(date +%H:%M:%S)."
else
echo "Sleeping for $1 seconds at $(date +%H:%M:%S)."
fi
fi
sleep $1
echo " Finished at $(date +%H:%M:%S)."
echo
}
gap=10
mingap=3
for i in {1..20} ; do
next=$(($(date +%s) + ${gap}))
payload ${i}
if [[ ${mingap} -ne 0 ]] ; then
sleep ${mingap}
fi
while [[ $(date +%s) -lt ${next} ]] ; do
sleep 1
done
done
Полезная нагрузка не является частью логики, это просто то, что у меня есть для целей отладки. Вы можете заменить это на что угодно. Кроме того, цикл for
также является образцом. Вы можете заменить его бесконечным циклом или сделать так, чтобы скрипт выполнял (например) только 60 минут итераций, при этом новый экземпляр скрипта запускается на cron
каждый час.
Пример работы следующий. Вы можете видеть, что полезная нагрузка запускается каждые десять секунд (с нечетными одиннадцатью секундами из-за капризов sleep
) до тех пор, пока это не займет более семи секунд. В этот момент минимальный разрыв вступает в силу.
Sleeping for 1 second at 14:36:08.
Finished at 14:36:09.
Sleeping for 2 seconds at 14:36:18.
Finished at 14:36:20.
Sleeping for 3 seconds at 14:36:28.
Finished at 14:36:31.
Sleeping for 4 seconds at 14:36:39.
Finished at 14:36:43.
Sleeping for 5 seconds at 14:36:49.
Finished at 14:36:54.
Sleeping for 6 seconds at 14:37:00.
Finished at 14:37:06.
Sleeping for 7 seconds at 14:37:10.
Finished at 14:37:17.
Sleeping for 8 seconds at 14:37:20.
Finished at 14:37:28.
Sleeping for 9 seconds at 14:37:31.
Finished at 14:37:41.
Sleeping for 10 seconds at 14:37:44.
Finished at 14:37:54.
Sleeping for 11 seconds at 14:37:57.
Finished at 14:38:08.
Sleeping for 12 seconds at 14:38:11.
Finished at 14:38:23.
Sleeping for 13 seconds at 14:38:27.
Finished at 14:38:40.
Sleeping for 14 seconds at 14:38:43.
Finished at 14:38:57.
Sleeping for 15 seconds at 14:39:00.
Finished at 14:39:15.
Sleeping for 16 seconds at 14:39:18.
Finished at 14:39:34.
Sleeping for 17 seconds at 14:39:38.
Finished at 14:39:55.
Sleeping for 18 seconds at 14:39:58.
Finished at 14:40:16.
Sleeping for 19 seconds at 14:40:19.
Finished at 14:40:38.
Sleeping for 20 seconds at 14:40:41.
Finished at 14:41:02.