n 秒後に systemd にサービスの状態をチェックさせる

n 秒後に systemd にサービスの状態をチェックさせる

私は systemd サービス (heka 用) を持っていますが、これが頭痛の種になっています。

問題は、heka デーモンが起動後すぐに終了しても、「start」が正常に返されることです。これは、構成ファイルが間違っている場合に発生します。たとえば、プロセスが起動し、構成を検証し、見つかった内容に満足できない場合は終了します。この場合、Systemd は正常に返されます。

初期化後に systemd にプログラムの状態を強制的にチェックさせる方法はありますか? プロセスの開始後 n 秒間スリープさせるなどでしょうか?

スクリプトは次のとおりです:

    [Unit]
    Description=Heka event/metric/log collection and routing daemon
    After=network.target auditd.service
    ConditionPathExists=!/etc/heka/hekad_not_to_be_run

    [Service]
    EnvironmentFile=-/etc/default/heka
    Type=simple
    PIDFile=/var/run/hekad.pid
    ExecStart=/usr/bin/hekad -config=/etc/heka
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    StandardError=inherit

    [Install]
    WantedBy=multi-user.target
    Alias=heka.service

答え1

複数のExecPostStartコマンドを連結することができます。また、メインのExecStartが失敗した場合でも、-/systemd.service: タイプ=)。 このようなもの:

ExecStart=-/usr/bin/hekad -config=/etc/heka
ExecStartPost=/bin/sleep 3
ExecStartPost=/bin/kill -0 $MAINPID &>/dev/null

MAINPIDこれにより、たとえばサービスを停止または再起動するときに、 を引き続き使用できるようになります。

答え2

がまだ動作中かどうかを確認する簡単な方法がある場合は、hekadを使用してデーモンを起動しExecStartPre=/usr/bin/hekad -config=/etc/hekaExecStart最初に X 秒間スリープし、次に hekad デーモンがまだ動作中かどうかを確認するループを含む小さなスクリプトを実行します。 がhekad停止したと思われる場合にのみループを中断します。

答え3

スリープしてからチェックを実行するコマンドまたはスクリプトを起動するには、を使用する必要がありますExecStartPost。これがゼロ以外で終了した場合、ユニットは失敗と見なされます。

見る:https://www.freedesktop.org/software/systemd/man/systemd.service.html

関連情報