Czy jednostka systemowego licznika czasu pomija następne uruchomienie, jeśli proces jeszcze się nie zakończył?

18

Chcę użyć systemd do uruchomienia polecenia co 5 minut. Istnieje jednak ryzyko, że czasami zadanie może trwać dłużej niż 5 minut. Czy w tym momencie systemd uruchomi drugą instancję polecenia, tj. Czy skończę z uruchomionymi 2 procesami?

Czy można powiedzieć systemd, aby nie rozpoczynał drugiego procesu, jeśli pierwszy nie został zakończony? Jeśli nie, jakie są dobre obejścia?

Uwaga: Mam nadzieję, że odpowiedź brzmi „To jest domyślne zachowanie. Po prostu nie jest to udokumentowane”. Jeśli tak jest, czy ktoś może mi powiedzieć, jak zgłosić błąd w stosunku do swoich dokumentów?

Uwaga: Cron ma podobny problem omówiony w /unix//a/173928/11244 . Szukam odpowiednika systemowego.

TomOnTime
źródło

Odpowiedzi:

27

To jest domyślne (i jedyne) zachowanie. Nie jest to wyraźnie udokumentowane, ale wynika z logiki operacji systemd.

systemd.timer (5) brzmi:

Dla każdego pliku timera musi istnieć pasujący plik jednostki, opisujący jednostkę, która ma być aktywowana po upływie czasu .

systemd (1) z kolei opisuje pojęcie stanów jednostek i przejść między nimi:

Jednostki mogą być „aktywne” (tzn. Uruchomione, powiązane, podłączone, ..., w zależności od typu jednostki, patrz poniżej) lub „nieaktywne” (tzn. Zatrzymane, niezwiązane, odłączone, ...), a także w proces aktywacji lub dezaktywacji , tj. między dwoma stanami (stany te nazywane są „aktywacją”, „dezaktywacją”).

Oznacza to, że wyzwolenie timera prowadzi do „aktywacji” dopasowanej jednostki, tj. Jej przejścia do stanu „aktywnego”.

Jeśli dopasowana jednostka jest już „aktywna” w momencie „aktywacji” (dla jednostki usługowej oznacza to, że „główny proces jest nadal uruchomiony”, chyba że jednostka usługowa ma Type=oneshoti RemainAfterExit=true), powinno być oczywiste, że żadne działanie nie będzie wzięty.

intelfx
źródło
Czy możesz wyjaśnić usługi „onehot”? Moim zdaniem usługa „oneshot” nie powinna w żadnym wypadku uruchamiać kolejnej kopii (strona: proces musi wyjść, zanim systemd rozpocznie jednostki kontrolne)
Gima
1
@Gima jednostka oneshot bez żadnych dodatkowych parametrów jest uważana za „aktywującą” podczas działania jej początkowego procesu i staje się „nieaktywna” po wyjściu. W tej chwili kolejny spust może ponownie aktywować tę jednostkę.
intelfx
1
@Gima ... jednak jednostka oneshot, która RemainAfterExit=truepozostanie „aktywna”, gdy zakończy się jej początkowy proces, więc kolejne wyzwalacze timera zostaną zignorowane, chyba że administrator wyraźnie dezaktywuje (zatrzyma) tę jednostkę lub zostanie obniżony przez negatywne zależności.
intelfx
1
Ciągle dostaję przedstawicieli, gdy ludzie zapraszają to. Mam nadzieję, że systemd nie wyjaśnia swoich dokumentów.
TomOnTime,
1
To jest teraz część systemd docs - 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