Systemd: come assicurare che un servizio "oneshot" venga riprovato se fallisce la prima volta?


18

Ho letto alcune volte la manpage del servizio systemd, ma non riesco ancora a capire un modello base di systemd:

Voglio eseguire un processo di avvio una volta (come un contenitore docker o formattare un'unità) all'avvio, con successo fino al completamento. Ma se uso Type = oneshot per questo, allora non posso usare Restart = on-failure, e se fallisce, allora non riproverò il lavoro. Mi sto perdendo qualcosa di ovvio qui?

Ho anche provato a impostare Type = simple con Restart = on-failure, ma in molti casi ho bisogno del seguente comportamento (dalla manpage) che i servizi oneshot danno:

Il comportamento di oneshot è simile a semplice; tuttavia, si prevede che il processo debba terminare prima che systemd avvii le unità di follow-up.

aggiornamenti:


Una soluzione alternativa che ho usato è quella di omettere Restarte avvolgere in my_cmd questo modo: ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'insieme a un TimeoutStartSecvalore ragionevole .
rozcietrzewiacz,

Hai visto FailureAction = ? Potrebbe essere in grado di ottenere lo stesso risultato Restart=impostando FailureAction=[self.unit](sostituisci [self.unit] con il nome dell'unità). È un po 'confuso, ma almeno esplicito e abbastanza facile da seguire.
Centimane,

@Centimane FailureActionaccetta gli stessi valori di StartLimitAction, e tutti tranne noneattivano un arresto di qualche tipo.
jpkotta,

Risposte:


5

Una possibile soluzione alternativa che sto provando è

  [Unit]
    Description=Tags instance and EBS vols
    After=docker.service
    Requires=docker.service

    [Service]
    ExecStartPre=/usr/bin/docker run --rm -v /opt/tag.sh:/tag.sh -v /opt:/ack --entrypoint=/bin/sh alpine /tag.sh
    ExecStartPre=/usr/bin/sh -c '[[ -e /opt/TAG_SUCCESS ]]'
    ExecStart=/usr/bin/rm /opt/TAG_SUCCESS
    Restart=on-failure
    RestartSec=30

Dove lo script tag.shsarà touch /ack/TAG_SUCCESSalla fine dell'esecuzione. Credo che questo si avvicini abbastanza al comportamento desiderato perché ExecStartPreverrà eseguito in sequenza, in attesa di un completamento con esito positivo prima di chiamare ExecStarte l'unità viene considerata solo Startinguna volta ExecStartchiamata, a quel punto siamo sicuri di aver completato l'attività di avvio.

Ma questo sembra ancora un trucco gigantesco?


Questo ha funzionato bene per me, tranne per il fatto che dovevo anche impostare RemainAfterExit=yesl'unità in modo che fosse "attiva" in modo che altre unità potessero dipendere da essa.
Guss
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.