Systemd: Bir "oneshot" hizmetinin ilk başarısız olması durumunda yeniden denenmesini nasıl sağlayabilirim?


18

Birkaç kez systemd servis manüel okudum, ama hala temel bir systemd desen anlayamıyorum:

Başlangıçta başarıyla tamamlanana kadar bir başlatma işlemini bir kez (docker kapsayıcısı veya bir sürücüyü biçimlendirmek gibi) çalıştırmak istiyorum. Ama bunun için Type = oneshot kullanırsam, Restart = on-fail kullanamazsınız ve başarısız olursa, işi yeniden denemez. Burada bariz bir şeyi mi kaçırıyorum?

Ayrıca Restart = on-fail ile Type = basit ayarını denedim, ancak bu birçok durumda oneshot hizmetlerinin verdiği aşağıdaki davranışa (manpage) gerekir:

Olanların davranışı basit olana benzer; ancak, systemd takip birimlerine başlamadan önce işlemin çıkması beklenir.

Güncellemeler:


Kullandığım bir çözüm, atlamak Restartve şu şekilde sarmaktır my_cmd : ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'makul bir TimeoutStartSecdeğerle birlikte .
rozcietrzewiacz

FailureAction = 'a baktınız mı? Aynı şeyi başarmak mümkün olabilir Restart=ayarlayarak FailureAction=[self.unit](birimin adı ile [self.unit] değiştirin). Bu bir tür hileli, ama en azından açık ve takip edilebilecek kadar kolay.
Centimane

@Centimane FailureActionile aynı değerleri alır StartLimitActionve her noneşey bir tür kapanmayı tetikler.
jpkotta

Yanıtlar:


5

Denediğim olası bir çözüm

  [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

Komut dosyasının yürütme sonunda nerede tag.sholacağı touch /ack/TAG_SUCCESS. Bunun istenen davranışa oldukça yaklaştığına inanıyorum çünkü ExecStartPresıralı olarak çalışacak, aramadan önce başarılı bir şekilde tamamlanmayı bekleyecek ExecStartve ünite sadece bir Startingkez kabul ExecStartedildiğinde başlangıç ​​görevini tamamladığımızdan emin olduk.

Ama bu hala dev bir hack gibi mi hissediyor?


Bu benim için iyi çalıştı, ancak RemainAfterExit=yesdiğer birimlerin ona bağlı olabilmesi için ünitenin "aktif" kalmasını sağlamak zorunda kaldım .
Guss
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.