我有一个 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
本来启动守护进程,该脚本有一个首先休眠 X 秒的循环,然后检查 hekad 守护进程是否仍在运行。仅当循环似乎已停止时才中断循环。ExecStartPre=/usr/bin/hekad -config=/etc/heka
ExecStart
hekad
答案3
您应该使用ExecStartPost
启动一个休眠然后运行检查的命令或脚本。如果该值非零,则该单元被视为故障。
看:https://www.freedesktop.org/software/systemd/man/systemd.service.html