Можно ли запускать задание 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 ().