Каково ваше намерение? Является ли cron правильным инструментом для этого?
Мануэль Фо
Хороший вопрос.
Прит Сангха
Например, в настоящее время я использую cron, чтобы изменить фоновое изображение своего рабочего стола, чтобы обойти ограничения встроенного переключателя фонового изображения (не углубляясь в подкаталоги). Если бы я хотел переключаться чаще, чем раз в минуту, я столкнулся бы с этим ограничением cron. (хотя у нативного bg switcher такое же ограничение)
donquixote
Ответы:
36
Если ваша задача должна выполняться так часто, cron - неправильный инструмент. Помимо того, что он просто не будет запускать задания так часто, вы также рискуете столкнуться с серьезными проблемами, если задание выполняется дольше, чем интервал между запусками. Перепишите свою задачу так, чтобы она демонизировалась и выполнялась постоянно, а затем, при необходимости, запустите ее из cron (при этом убедитесь, что она не перезапустится, если она уже запущена).
Часть «вы также рискуете некоторыми серьезными проблемами, если работа выполняется дольше, чем интервал между запусками». неверно, и в этом случае оно будет в равной степени применяться к заданиям, которые выполняются каждые 5 минут, каждый час или каждый месяц. Эта проблема имеет решения (использование pid-файла или чего-либо еще и проверка того, выполняется ли уже задание перед его выполнением). Таким образом, проблема в том, что cron просто не допустит эту частоту, но неверно говорить, что что-то не так в выполнении задачи каждую минуту.
Маттео
2
Я имел в виду, если вы не используете pidfile. Если ваша работа выполняется каждые X минут и занимает больше X минут, вы в конечном итоге будете складывать задания. Если ваша работа также ограничена каким-либо ресурсом (процессор, пропускная способность сети / диска и т. Д.), То выполнение большего количества за один раз может занять еще больше времени, и в конечном итоге ваш компьютер превратится в беспорядочный беспорядок.
сумерки
2
Вы можете использовать, run-oneчтобы программа / даже скрипт PHP не запускали дублирующийся экземпляр. sudo apt-get install run-oneи назовите этоrun-one <normal command>
kouton
3
Как показывают ответы ниже, это вполне возможно, хотя и немного хакерски. Почему вы делаете это неправильно !!!! принятый ответ здесь, когда он вообще не отвечает на вопрос?
кто-то
@Mantriur Потому что автор вопроса нашел его полезным и пометил его как принятый ответ? :) А если серьезно, то вы уже определили проблему самостоятельно: многие другие современные ответы предлагали хакерские решения, которые было бы неразумно использовать в производственной системе. (Также имейте в виду, что некоторые из других ответов появились только спустя годы после того, как вопрос был задан, поэтому они еще не были готовы принять!)
duskwuff
37
Кандидат на самое творческое злоупотребление командой Linux:
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. Двойное значение больше, чем приводит к тому, что вывод добавляется в файл при каждом вызове, а не перезаписывается предыдущее содержимое.
Редактировать :
Возможно, еще одна вещь, которой можно злоупотреблять (или, возможно, это законное использование), это системные таймеры.
Я постараюсь опубликовать пример в ближайшее время.
Приостановлено до дальнейшего уведомления. источник
6
Я даю +1 за чистую щеку
Мэтт Симмонс
2
Было бы неплохо иметь немного больше объяснений с этим ответом. Команда nohup является новой для меня. Интернет говорит мне, что нужно игнорировать сигнал зависания. Что все еще оставляет меня в замешательстве.
Donquixote
2
@donquixote: Важно признать, что команда в целом в моем ответе не рекомендуется, поэтому следует использовать слово «неправильное использование». Однако, чтобы прояснить для вас кое-что, поскольку есть полезные методы, я попытаюсь описать несколько. &Заставляет команду работать в фоновом режиме, возвращая управление в командную строку немедленно. Использование nohupкоманды приводит к тому, что фоновый процесс (в данном случае watch) игнорирует сигнал зависания, который отправляется при выходе из оболочки, например при закрытии терминала. ...
Приостановлено до дальнейшего уведомления.
1
... Перенаправление вывода с использованием >/dev/nullприводит к тому, что вывод отбрасывается и предотвращает создание nohup.outфайла, который в противном случае был бы создан, если стандартный вывод является терминалом.
Приостановлено до дальнейшего уведомления.
1
@donquixote: Не только через 30 секунд, каждые 30 секунд. Остальное, чтобы он работал в фоновом режиме без присмотра, чтобы быть более похожим на cron. Если вы хотите использовать sleep, вам нужно написать цикл, чтобы процесс повторялся (повторяет watchли это для вас, как делает cron). Тебе все равно нужно nohupи &. Дополнительной проблемой sleepбудет смещение времени. --preciseВариант watchпозволяет избежать этого. Без него или при использовании sleepв цикле временной интервал содержит время, необходимое для запуска команд или сценария, добавляемое к нему, поэтому каждый запуск становится позже и позже ...
Приостановлено до дальнейшего уведомления.
13
Cron предназначен для того, чтобы просыпаться каждую минуту, поэтому невозможно сделать это без какого-либо взлома, например, сна, как вы упоминали.
Frequent-cron хорошо сработал и для нас, и работает на многих наших производственных системах. У нас никогда не было проблем с этим.
Homer6
2
У меня есть пара проблем:
(1) иногда система загружается и не может начать все точно с 30-секундной точки, тогда возможно, что в то же время, когда вы выполняете одно задание, всплывет другое задание, и тогда у вас будет 2 (или более) задания, выполняющих одно и то же вещь. В зависимости от сценария, здесь могут быть некоторые существенные помехи. Таким образом, кодирование в таком сценарии должно содержать некоторый код, чтобы гарантировать, что одновременно выполняется только один экземпляр данного сценария.
(2) Сценарий может иметь много накладных расходов и потреблять больше системных ресурсов, чем вы могли бы захотеть. Это верно, если вы конкурируете с множеством других системных действий.
Таким образом, как сказал один из авторов, в этом случае я бы серьезно подумал о том, чтобы запустить демона, работающего с дополнительными процессами, чтобы он продолжал работать, если он имеет решающее значение для ваших операций.
использование flockкоманды позволяет избежать запуска сценария несколькими экземплярами одновременно. Это может быть очень важно в большинстве случаев.
flockи watchкоманды доступны в большинстве установок Linux
Может кто-нибудь объяснить это новичку в Linux - с за и против? Спасибо ..
а20
@asvany Я думаю, что мне нравится это решение, но как a20, не могли бы вы опубликовать некоторые объяснения для Linux "зеленый", пожалуйста? ти.
JoelAZ
0
Решение, если это для вашего собственного сценария или если вы можете обернуть его:
Получите и запомните время начала.
Если файл блокировки, к которому вы будете обращаться позже, присутствует, и сценарий не работает в течение 60 секунд, подождите секунду и проверьте снова. (например, во время / сна) *
Если файл блокировки все еще присутствует по истечении 60 секунд, выйдите с предупреждением об устаревшей блокировке.
Сенсорный файл блокировки.
Пока скрипт не работал в течение 60 секунд, зациклите текущую задачу с желаемой продолжительностью сна.
Удалить файл блокировки.
Добавить как мелко крона.
Боб твой дядя.
Меньше головной боли, чем создание и мониторинг демона.
* Если вы используете PHP, помните clearstatcache ().
Ответы:
Если ваша задача должна выполняться так часто, cron - неправильный инструмент. Помимо того, что он просто не будет запускать задания так часто, вы также рискуете столкнуться с серьезными проблемами, если задание выполняется дольше, чем интервал между запусками. Перепишите свою задачу так, чтобы она демонизировалась и выполнялась постоянно, а затем, при необходимости, запустите ее из cron (при этом убедитесь, что она не перезапустится, если она уже запущена).
источник
run-one
чтобы программа / даже скрипт PHP не запускали дублирующийся экземпляр.sudo apt-get install run-one
и назовите этоrun-one <normal command>
Кандидат на самое творческое злоупотребление командой Linux:
Если
yourprog
состоит из:тогда
yourprog.out
может выглядеть так:показывая довольно хороший уровень точности.
Вот объяснение частей команды:
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 предназначен для того, чтобы просыпаться каждую минуту, поэтому невозможно сделать это без какого-либо взлома, например, сна, как вы упоминали.
источник
Не забудьте написать что-нибудь в свою программу, чтобы она вышла, если предыдущий экземпляр уже запущен.
Конечно, это все еще оставляет очень маленькую возможность для сбоя, поэтому поищите в 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
команды позволяет избежать запуска сценария несколькими экземплярами одновременно. Это может быть очень важно в большинстве случаев.flock
иwatch
команды доступны в большинстве установок Linuxминусы
watch
командуисточник
Решение, если это для вашего собственного сценария или если вы можете обернуть его:
Меньше головной боли, чем создание и мониторинг демона.
* Если вы используете PHP, помните clearstatcache ().
источник