Системный таймер пропускает следующий запуск, если процесс еще не завершен?

18

Я хочу использовать systemd для запуска команды каждые 5 минут. Однако существует риск того, что время от времени выполнение задачи может занять более 5 минут. В этот момент systemd запустит второй экземпляр команды, то есть я получу 2 запущенных процесса?

Можно ли сказать systemd не запускать второй процесс, если первый еще не завершен? Если нет, какие есть хорошие обходные пути?

Примечание: я надеюсь, что ответ «Это поведение по умолчанию. Оно просто не задокументировано». Если это так, может кто-нибудь сказать мне, как сообщить об ошибке в их документах?

Примечание: у Cron есть похожая проблема, которая обсуждается в /unix//a/173928/11244 . Я ищу системный эквивалент.

TomOnTime
источник

Ответы:

27

Это стандартное (и единственное) поведение. Это явно не задокументировано, но подразумевается логикой работы systemd.

systemd.timer (5) читает:

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

systemd (1) , в свою очередь, описывает концепцию состояний единиц и переходов между ними:

Единицы могут быть «активными» (что означает «запущен», «связан», «подключен»,…, в зависимости от типа модуля, см. Ниже) или «неактивны» (что означает «остановлен», «не связаны», «отключен», ...), а также в процесс активации или деактивации , то есть между двумя состояниями (эти состояния называются «активация», «деактивация»).

Это означает, что запуск таймера приводит к «активации» соответствующего блока, т.е. его переходу в «активное» состояние.

Если соответствующий модуль уже «активен» во время «активации» (для сервисного блока это означает, что «основной процесс все еще выполняется», если сервисный блок не имеет Type=oneshotи RemainAfterExit=true), должно быть очевидно, что никаких действий не будет приняты.

intelfx
источник
Не могли бы вы уточнить "onehot" -услуги? На мой взгляд «OneShot» -сервис не должен запустить другую копию при любых обстоятельствах (страница руководства: процесс имеет для выхода до Systemd начинается последующие единицы)
Gima
1
@ Gima единичный выстрел без каких-либо дополнительных параметров считается «активирующим», когда выполняется его начальный процесс, и становится «неактивным» при выходе. В это время другой триггер может снова активировать это устройство.
intelfx
1
@Gima ... однако единичная единица, которая RemainAfterExit=trueбудет оставаться «активной» при выходе из своего начального процесса, поэтому последующие триггеры таймера будут игнорироваться, если только администратор не деактивирует (не остановит) эту единицу явно, или она не будет отключена отрицательным зависимостей.
intelfx
1
Я продолжаю получать репутацию, поскольку люди приглашают это. Я надеюсь, что systemd не уточняет их документы.
TomOnTime
1
Теперь это часть документации systemd - Note that in case the unit to activate is already active at the time the timer elapses it is not restarted, but simply left running. There is no concept of spawning new service instances in this case. freedesktop.org/software/systemd/man/systemd.timer.html
Сэм,