Я могу выполнять задание крона более часто, чем каждая минута?

Довольно часто эта функция может быть обработана Вашим маршрутизатором. Даже простой маршрутизатор дома/игр как DGL-4100 D-Link содержит функциональность QoS. Другое больше "бизнес-" продуктов уровня как Sonicwall доступно и сделает это также. Я думаю, что Вы найдете аппаратное решение намного более управляемым, чем что-то, открытый исходный код в конечном счете и стоимость незначительны.

44
задан 2 August 2009 в 23:48
9 ответов

Если Ваша задача должна часто выполнять это, крон является неправильным инструментом. Кроме того, что это просто не запустит задания, что часто, Вы также рискуете некоторыми серьезными проблемами, если задание занимает больше времени для выполнения, чем интервал между запусками. Перепишите свою задачу к daemonize и работайте постоянно, затем запустите его от крона при необходимости (при проверке, что это не повторно запустится, если это будет уже работать).

36
ответ дан 28 November 2019 в 19:40

Крон разработан для пробуждения в каждую минуту, таким образом, не возможно сделать это без некоторого взламывания, например, спать как Вы упомянутый.

13
ответ дан 28 November 2019 в 19:40

Кандидат на самое творческое неправильное употребление команды Linux:

nohup watch -n 30 --precise yourprog >/dev/null &

Если yourprog состоит из:

date +%M.%S.%N >> yourprog.out

затем yourprog.out мог бы быть похожим:

50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676

указание на довольно хороший уровень точности.

Вот объяснение частей команды:

  • nohup - Это сохраняет команду, которая следует за ним, watch в этом случае, от выхода, когда терминал выходит.
  • watch - Это прогоны программы команда неоднократно. Обычно первый экранный из вывода от команды отображен каждый раз watch выполняет команду.
  • -n 30 - Интервал, в котором можно выполнить команду. В этом случае это каждые тридцать секунд.
  • --precise - Без этой опции, watch выполняет команду после секунд интервала. С ним каждый запускает команды, начинается на интервале, если это возможно. Если бы эта опция не была указана в примере, то времена добрались бы позже и позже больше чем на 30 секунд каждый раз из-за времени, которое требуется, чтобы запустить и выполнить команду (yourprog).
  • yourprog - Программа или командная строка для watch выполниться. Если командная строка будет содержать символы, особенные для оболочки (например, пространство или точка с запятой), то это должно будет быть заключено в кавычки.
  • >/dev/null - Большее - чем перенаправления вывод команды, выполняемой watch в файл, /dev/null. Тот файл отбрасывает любые данные, записанные в него. Это препятствует тому, чтобы вывод был записан в экран или с тех пор nohup используется, это препятствует тому, чтобы вывод был отправлен в названный файл nohup.out.
  • & - watch команда выполняется в фоновом режиме, и управление возвращается к терминальному или родительскому процессу.

Отметьте это nohup, перенаправление вывода и & фоновый оператор управления не характерен для watch.

Вот объяснение примера yourprog сценарий:

  • date - Производит текущую дату и/или время. Это может также установить их.
  • +%M.%S.%N - Это указывает выходной формат для date использовать. %M текущая минута, %S текущая секунда и %N текущая наносекунда.
  • >> yourprog.out - Это перенаправляет вывод date управляйте в названный файл yourprog.out. Двойное большее - чем причины вывод, который будет добавлен в файл на каждом вызове, а не предыдущем перезаписываемом содержании.

Править:

Возможно другой вещью, которая могла быть неправильно использована (или возможно это - законное использование) являются systemd таймеры.

См. systemd/Timers как замену крона и Крон по сравнению с systemd таймерами.

Я попытаюсь отправить пример скоро.

37
ответ дан 28 November 2019 в 19:40
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program

Не забудьте что-нибудь записать в свою программу, чтобы она закрывалась, если предыдущий экземпляр уже запущен.

#!/bin/sh

if ln -s "pid=$$" /var/pid/myscript.pid; then
  trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
  echo "Already running, or stale lockfile." >&2
  exit 1
fi

Конечно, это все еще оставляет очень небольшую вероятность сбоя, поэтому ищите Google, чтобы найти лучшее решение, применимое к вашей среде.

10
ответ дан 28 November 2019 в 19:40

У меня было бы несколько проблем:

(1) иногда система начинает действовать и не может запустить вещи точно на 30-секундной точке, затем возможно, что одновременно Вы выполняете одно задание, которое вытолкало бы другое задание, и затем Вы имеете 2 (или больше) задания, делающие то же самое. В зависимости от сценария здесь может быть некоторая значительная помеха. Таким образом кодирование в таком сценарии должно содержать некоторый код, чтобы обеспечить, чтобы только один экземпляр данных сценариев работал одновременно.

(2) Сценарий мог возможно иметь много издержек и использовать больше системных ресурсов, чем Вы могли бы хотеть. Это верно, если Вы конкурируете против большого количества других системных операций.

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

2
ответ дан 28 November 2019 в 19:40

Вы можете сделать это с помощью стороннего программного обеспечения.

У меня хорошо сработал вариант частый cron

Он обеспечивает точность до миллисекунд и дает вам возможность чтобы отложить следующее выполнение до выхода из текущего.

8
ответ дан 28 November 2019 в 19:40

Решение, если это для вашего собственного скрипта или если вы можете его обернуть:

  1. Получить и запомнить время запуска.
  2. Если присутствует файл блокировки, к которому вы будете прикасаться позже, и скрипт не работал в течение 60 секунд, подождите секунду и проверьте еще раз. (например, во время сна)*
  3. Если файл замка все еще присутствует по истечении 60 секунд, выйдите с залежавшимся предупреждением о блокировке.
  4. Сенсорный файл замка.
  5. Несмотря на то, что скрипт не работал в течение 60 секунд, зациклируйте ваше фактическое задание с желаемой длительностью сна.
  6. Удалите lock file.
  7. Добавьте как минимум cron.
  8. Боб - ваш дядя.

Меньше головной боли, чем сборка и мониторинг демона.

*Если вы используете PHP, запомните clearstatcache().

.
0
ответ дан 28 November 2019 в 19:40

мое самое простое и любимое решение для этой задачи:

запись cron:
* * * * flock -w0 /path/to/script /path/to/script

script:
while true;do echo doing something; sleep 10s;done

lazy alternative: :)

* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log

или

* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script

pros

  • использование команды flock позволяет избежать запуска сценария несколькими экземплярами в одно и то же время. Это может быть очень важно в большинстве случаев.
  • flock и watch команды доступны в большинстве инсталляций Linux

против

  • остановка такого рода "Сервиса" требует двух этапов
    • закомментируйте запись cron
    • kill the script или команда watch
1
ответ дан 28 November 2019 в 19:40

Не точный ответ на ваш вопрос, но я думаю, что некоторым он может быть полезен в любом случае. Если вы хотите запускать команду каждую секунду , вы можете сделать это следующим образом. Каждую минуту он проходит через 60 секунд, запускает сценарий во вспомогательной оболочке и засыпает на 1 секунду. Вам необходимо убедиться, что вы создали файл блокировки (или аналогичный механизм) и соответственно прервали выполнение script.pl (если вы не хотите запускать его несколько раз параллельно).

* * * * * for((i=0; i<60; i++)); do /usr/bin/perl script.pl & sleep 1; done;
1
ответ дан 5 March 2020 в 16:06

Теги

Похожие вопросы