Довольно часто эта функция может быть обработана Вашим маршрутизатором. Даже простой маршрутизатор дома/игр как DGL-4100 D-Link содержит функциональность QoS. Другое больше "бизнес-" продуктов уровня как Sonicwall доступно и сделает это также. Я думаю, что Вы найдете аппаратное решение намного более управляемым, чем что-то, открытый исходный код в конечном счете и стоимость незначительны.
Если Ваша задача должна часто выполнять это, крон является неправильным инструментом. Кроме того, что это просто не запустит задания, что часто, Вы также рискуете некоторыми серьезными проблемами, если задание занимает больше времени для выполнения, чем интервал между запусками. Перепишите свою задачу к daemonize и работайте постоянно, затем запустите его от крона при необходимости (при проверке, что это не повторно запустится, если это будет уже работать).
Крон разработан для пробуждения в каждую минуту, таким образом, не возможно сделать это без некоторого взламывания, например, спать как Вы упомянутый.
Кандидат на самое творческое неправильное употребление команды 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 таймерами.
Я попытаюсь отправить пример скоро.
* * * * * /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, чтобы найти лучшее решение, применимое к вашей среде.
У меня было бы несколько проблем:
(1) иногда система начинает действовать и не может запустить вещи точно на 30-секундной точке, затем возможно, что одновременно Вы выполняете одно задание, которое вытолкало бы другое задание, и затем Вы имеете 2 (или больше) задания, делающие то же самое. В зависимости от сценария здесь может быть некоторая значительная помеха. Таким образом кодирование в таком сценарии должно содержать некоторый код, чтобы обеспечить, чтобы только один экземпляр данных сценариев работал одновременно.
(2) Сценарий мог возможно иметь много издержек и использовать больше системных ресурсов, чем Вы могли бы хотеть. Это верно, если Вы конкурируете против большого количества других системных операций.
Таким образом как один плакат выразился, в этом случае я серьезно полагал бы, что включение демона, работающего с дополнительными процессами, гарантирует, что остается работать если жизненная важность для Ваших операций.
Вы можете сделать это с помощью стороннего программного обеспечения.
У меня хорошо сработал вариант частый cron
Он обеспечивает точность до миллисекунд и дает вам возможность чтобы отложить следующее выполнение до выхода из текущего.
Решение, если это для вашего собственного скрипта или если вы можете его обернуть:
Меньше головной боли, чем сборка и мониторинг демона.
*Если вы используете PHP, запомните clearstatcache().
.запись cron:
* * * * flock -w0 /path/to/script /path/to/script
script:
while true;do echo doing something; sleep 10s;done
* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log
или
* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script
flock
позволяет избежать запуска сценария несколькими экземплярами в одно и то же время. Это может быть очень важно в большинстве случаев.flock
и watch
команды доступны в большинстве инсталляций Linux watch
Не точный ответ на ваш вопрос, но я думаю, что некоторым он может быть полезен в любом случае. Если вы хотите запускать команду каждую секунду , вы можете сделать это следующим образом. Каждую минуту он проходит через 60 секунд, запускает сценарий во вспомогательной оболочке и засыпает на 1 секунду. Вам необходимо убедиться, что вы создали файл блокировки (или аналогичный механизм) и соответственно прервали выполнение script.pl
(если вы не хотите запускать его несколько раз параллельно).
* * * * * for((i=0; i<60; i++)); do /usr/bin/perl script.pl & sleep 1; done;