Systemd:最初に失敗した場合に「ワンショット」サービスが再試行されることを保証する方法は?


17

systemdサービスのマンページを数回読んだことがありますが、基本的なsystemdパターンはまだわかりません。

起動時に1回(ドッカーコンテナーのように、またはドライブをフォーマットして)起動プロセスを1回実行し、正常に完了したい。しかし、そのためにType = oneshotを使用する場合、Restart = on-failureを使用できません。また、失敗した場合、ジョブを再試行しません。ここで明らかな何かを見逃していますか?

また、Restart = on-failureでType = simpleを設定しようとしましたが、多くの場合、oneshotサービスが提供する次の動作(マンページから)が必要です。

ワンショットの動作は単純に似ています。ただし、systemdがフォローアップユニットを開始する前にプロセスを終了する必要があります。

更新:


一つは、使用してきました、私は省略している回避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

私が試みている1つの可能な回避策は

  [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他のユニットがそれに依存できるように、ユニットを「アクティブ」に保つように設定する必要がありました。
グス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.