cron через каждые 15 секунд - PullRequest
       73

cron через каждые 15 секунд

4 голосов
/ 22 сентября 2010

Я не могу установить время cron менее 1 минуты даже на моем выделенном сервере. Мне нужно, чтобы он запускался каждые 15 секунд, потому что он вызывает betfair api и расчеты сильно зависят от времени. Пожалуйста, сообщите.

Ответы [ 3 ]

11 голосов
/ 22 сентября 2010

Если вам нужно вызывать работу каждые 15 секунд, не используйте cron. cron предназначен для запроса заданий, которые будут выполнены намного позже.

Вместо этого, после того, как родитель завершит работу, поспите 15 секунд, затем вызовите дочерний сценарий и выйдите из него. Дочерний сценарий может выполнить свою работу, поспать 15 секунд, а затем вызвать следующий сценарий. Вспенить, промыть, повторить.

Если на вашем сервере нет ограничения по времени, вам даже не нужно создавать дочерний скрипт. Просто спите каждые 15 секунд, делайте свое дело, спите 15 секунд, делайте следующее и так далее. Спящий сценарий не потребляет процессор, хотя он потребляет оперативную память. Но это лучше, чем езда на велосипеде PID вашего хоста; что может привести к тому, что вашему хосту станет не по себе.

7 голосов
/ 22 сентября 2010

Cron позволяет вам запускать вещи так быстро, как раз в минуту.

То, что я хотел бы сделать, это сделать 15-секундные тайминги внутри вашего скрипта.

  • Выполнять родительский скрипт раз в минуту.
  • Выполняйте дочерние сценарии каждые 15 секунд внутри этого сценария, прежде чем он существует и начинается новый цикл.
1 голос
/ 22 сентября 2010

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.
...