Можно ли запускать задание cron каждые 30 секунд без команды sleep?
Можно ли запускать задание cron каждые 30 секунд без команды sleep?
Ответы:
Если ваша задача должна выполняться так часто, cron - неправильный инструмент. Помимо того, что он просто не будет запускать задания так часто, вы также рискуете столкнуться с серьезными проблемами, если задание выполняется дольше, чем интервал между запусками. Перепишите свою задачу так, чтобы она демонизировалась и выполнялась постоянно, а затем, при необходимости, запустите ее из cron (при этом убедитесь, что она не перезапустится, если она уже запущена).
run-oneчтобы программа / даже скрипт PHP не запускали дублирующийся экземпляр. sudo apt-get install run-oneи назовите этоrun-one <normal command>
Кандидат на самое творческое злоупотребление командой 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 / Timers как замену cron и Cron против системных таймеров .
Я постараюсь опубликовать пример в ближайшее время.
&Заставляет команду работать в фоновом режиме, возвращая управление в командную строку немедленно. Использование nohupкоманды приводит к тому, что фоновый процесс (в данном случае watch) игнорирует сигнал зависания, который отправляется при выходе из оболочки, например при закрытии терминала. ...
>/dev/nullприводит к тому, что вывод отбрасывается и предотвращает создание nohup.outфайла, который в противном случае был бы создан, если стандартный вывод является терминалом.
sleep, вам нужно написать цикл, чтобы процесс повторялся (повторяет watchли это для вас, как делает cron). Тебе все равно нужно nohupи &. Дополнительной проблемой sleepбудет смещение времени. --preciseВариант watchпозволяет избежать этого. Без него или при использовании sleepв цикле временной интервал содержит время, необходимое для запуска команд или сценария, добавляемое к нему, поэтому каждый запуск становится позже и позже ...
Cron предназначен для того, чтобы просыпаться каждую минуту, поэтому невозможно сделать это без какого-либо взлома, например, сна, как вы упоминали.
* * * * * /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 лучшее решение, подходящее для вашей среды.
without a sleep command
Вы можете сделать это с помощью стороннего программного обеспечения.
Опция, которая хорошо сработала для меня - это часто встречающийся
Это позволяет с точностью до миллисекунды и дает вам возможность отложить следующее выполнение до завершения текущего.
У меня есть пара проблем:
(1) иногда система загружается и не может начать все точно с 30-секундной точки, тогда возможно, что в то же время, когда вы выполняете одно задание, всплывет другое задание, и тогда у вас будет 2 (или более) задания, выполняющих одно и то же вещь. В зависимости от сценария, здесь могут быть некоторые существенные помехи. Таким образом, кодирование в таком сценарии должно содержать некоторый код, чтобы гарантировать, что одновременно выполняется только один экземпляр данного сценария.
(2) Сценарий может иметь много накладных расходов и потреблять больше системных ресурсов, чем вы могли бы захотеть. Это верно, если вы конкурируете с множеством других системных действий.
Таким образом, как сказал один из авторов, в этом случае я бы серьезно подумал о том, чтобы запустить демона, работающего с дополнительными процессами, чтобы он продолжал работать, если он имеет решающее значение для ваших операций.
Запись cron:
* * * * * flock -w0 /path/to/script /path/to/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команды доступны в большинстве установок LinuxwatchкомандуРешение, если это для вашего собственного сценария или если вы можете обернуть его:
Меньше головной боли, чем создание и мониторинг демона.
* Если вы используете PHP, помните clearstatcache ().