Systemd: Як запевнити, що послуга “onehot” буде повторена, якщо вона не працює вперше?


18

Я декілька разів прочитав мандат сторінки служби systemd, але все ще не можу визначити основний шаблон системи:

Я хочу запустити процес запуску один раз (як контейнер докера або відформатувати диск) під час завантаження, успішно до завершення. Але якщо для цього я використовую Type = oneshot, я не можу використовувати Restart = on-fail, і якщо він не вдасться, він не повторить роботу. Я пропускаю тут щось очевидне?

Я також спробував встановити Type = simple за допомогою Restart = on-fail, але для цього мені потрібна така поведінка (з manpage сторінки), яку надають onehot служби:

Поведінка одного з них схожа на просту; однак, очікується, що процес повинен завершитися до того, як системні системи почнуть спостереження.

Оновлення:


Одне вирішення, яке я використав, - це опустити Restartта загорнути my_cmd так: ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'разом із деяким розумним TimeoutStartSecзначенням.
rozcietrzewiacz

Ви подивилися на FailureAction = ? Ви можете домогтися того ж, що Restart=встановивши FailureAction=[self.unit](замініть [self.unit] на ім'я пристрою). Це наче хакі, але принаймні явне і досить просте.
Centimane

@Centimane FailureActionприймає ті самі значення StartLimitAction, що і всі, крім того, що noneвикликає якесь відключення.
jpkotta

Відповіді:


5

Я намагаюся вирішити одне з можливих варіантів

  [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

Де сценарій tag.shбуде touch /ack/TAG_SUCCESSв кінці виконання. Я вважаю, що це наближається до бажаної поведінки, оскільки ExecStartPreпослідовно буде виконуватися, чекаючи успішного завершення до виклику, ExecStartі пристрій розглядається лише Startingодин раз, коли він ExecStartбуде викликаний, до якого моменту ми впевнені, що виконали завдання запуску.

Але це все ще відчувається як гігантський хакер?


Це спрацювало для мене добре, за винятком того, що я також повинен був налаштувати так, RemainAfterExit=yesщоб блок залишався "активним", щоб інші підрозділи могли залежати від нього.
Гасс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.