L'unità timer systemd salta la corsa successiva se il processo non è ancora terminato?


18

Voglio usare systemd per eseguire un comando ogni 5 minuti. Tuttavia, esiste il rischio che a volte l'attività possa richiedere più di 5 minuti per l'esecuzione. A quel punto, systemd avvierà una seconda istanza del comando, cioè finirò con 2 processi in esecuzione?

È possibile dire a systemd di non avviare un secondo processo se il primo non è stato completato? In caso contrario, quali sono alcune buone soluzioni?

Nota: spero che la risposta sia "Questo è il comportamento predefinito. Semplicemente non è documentato". Se questa è la situazione, qualcuno può dirmi come presentare un bug contro i propri documenti?

Nota: Cron ha un problema simile che è discusso in /unix//a/173928/11244 . Sto cercando l'equivalente systemd.

Risposte:


27

Questo è il comportamento predefinito (e l'unico). Non è esplicitamente documentato, ma è implicito dalla logica di funzionamento di systemd.

systemd.timer (5) dice:

Per ogni file timer, deve esistere un file unità corrispondente, che descriva l'unità da attivare alla scadenza del timer .

systemd (1) , a sua volta, descrive il concetto di stati unitari e le transizioni tra di essi:

Le unità possono essere "attive" (significato avviato, associato, collegato, ..., a seconda del tipo di unità, vedere di seguito) o "inattivo" (significato arrestato, non associato, non collegato, ...), nonché in il processo di attivazione o disattivazione , ovvero tra i due stati (questi stati sono chiamati "attivazione", "disattivazione").

Ciò significa che l'attivazione di un timer porta all'attivazione dell'unità corrispondente, ovvero alla sua transizione allo stato "attivo".

Se l'unità corrispondente è già "attiva" al momento dell '"attivazione" (per un'unità di servizio, ciò significa "il processo principale è ancora in esecuzione", a meno che l'unità di servizio non abbia Type=oneshote RemainAfterExit=true), dovrebbe essere ovvio che nessuna azione sarà prese.


Potresti chiarire i servizi "oneshot"? A mio avviso, un servizio "oneshot" non dovrebbe eseguire un'altra copia in nessun caso (manpage: il processo deve terminare prima che systemd avvii le unità di follow-up)
Gima,

1
@Gima un'unità oneshot senza parametri aggiuntivi viene considerata "attiva" mentre il suo processo iniziale è in esecuzione e diventa "inattiva" quando esce. In questo momento, un altro trigger può attivare di nuovo quell'unità.
intelfx,

1
@Gima ... tuttavia, un'unità oneshot che RemainAfterExit=truerimane rimarrà "attiva" quando termina il suo processo iniziale, quindi i successivi trigger di un timer verranno ignorati a meno che un amministratore non disattivi (arresti) esplicitamente quell'unità o sia abbattuto da un negativo dipendenze.
intelfx,

1
Continuo a ottenere rappresentante mentre le persone lo invitano. Spero che systemd non chiarisca i loro documenti.
TomOnTime

1
Questo fa ora parte dei documenti 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.