it-swarm-ru.tech

Могу ли я выполнять работу cron чаще, чем каждую минуту?

Можно ли запускать задание cron каждые 30 секунд без команды sleep?

48
user15336

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

38
duskwuff -inactive-

Кандидат на самое креативное неправильное использование команды 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 против systemd таймеров .

Я постараюсь опубликовать пример в ближайшее время.

39
Paused until further notice.

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

14
Balázs Pozsár
* * * * * /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 лучшее решение, подходящее для вашей среды.

13
ghoti

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

Опция, которая хорошо сработала для меня: часто-cron

Это позволяет с точностью до миллисекунды и дает вам возможность отложить следующее выполнение до завершения текущего.

8
thatjuan

У меня есть пара проблем:

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

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

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

2
mdpc

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

запись 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 доступны в большинстве установок Linux

минусы

  • остановка такого рода "Службы" требует двух шагов
    • закомментируйте запись cron
    • убить скрипт или команду watch
1
asvany

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

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

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

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

0
Someone