Чи пропускає блок системного таймера наступний запуск, якщо процес ще не закінчився?


18

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

Чи можна сказати systemd не запускати другий процес, якщо перший не завершився? Якщо ні, то які хороші обходи?

Примітка. Я сподіваюся, що відповідь "Це поведінка за замовчуванням. Це просто не задокументовано". Якщо така ситуація, чи може хтось мені сказати, як подати помилку на свої документи?

Примітка: Cron має подібну проблему, про яку йдеться в /unix//a/173928/11244 . Я шукаю системний еквівалент.

Відповіді:


27

Це поведінка за замовчуванням (і єдина). Це не є явно задокументованим, але має на увазі логіку роботи системи.

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

Для кожного файлу таймера повинен існувати відповідний файл одиниці, який описує блок, який потрібно активувати, коли таймер закінчиться .

systemd (1) , у свою чергу, описує поняття одиничних станів та переходів між ними:

Одиниці можуть бути "активними" (значить розпочати, зв'язати, підключити, ..., залежно від типу одиниці, див. Нижче), або "неактивні" (тобто зупинено, не зв’язано, відключено, ...), а також у процес активації або деактивації , тобто між двома станами (ці стани називаються "активація", "дезактивація").

Це означає, що спрацьовування таймера призводить до "активації" узгоджуючого блоку, тобто його переходу в "активний" стан.

Якщо підрозділ відповідності вже "активний" під час "активації" (для сервісного блоку це означає, що "основний процес все ще запущений", якщо у нього не є Type=oneshotі RemainAfterExit=true), повинно бути очевидним, що жодних дій не буде прийнято.


Не могли б ви уточнити "onehot" -послуг? На мій погляд, "onehot" -сервіс не повинен запускати іншу копію ні за яких обставин (manpage: процес повинен завершитися до запуску системних підрозділів)
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
Sam
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.