私は 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/heka
、ExecStart
最初に X 秒間スリープし、次に hekad デーモンがまだ動作中かどうかを確認するループを含む小さなスクリプトを実行します。 がhekad
停止したと思われる場合にのみループを中断します。
答え3
スリープしてからチェックを実行するコマンドまたはスクリプトを起動するには、を使用する必要がありますExecStartPost
。これがゼロ以外で終了した場合、ユニットは失敗と見なされます。
見る:https://www.freedesktop.org/software/systemd/man/systemd.service.html