目前我面临以下问题作为我的服务文件
[Unit]
Description=XYZ Service
[Service]
User=root
Group=root
TimeoutStartSec=900
Type=simple
KillMode=process
ExecStart=/bin/bash -lc '/xyz/run.sh start'
ExecReload=/bin/bash -lc '/xyz/run.sh autorecover'
ExecStop=/bin/bash -lc '/xyz/run.sh restart'
PIDFile=/xyz/bin/dgs.pid
StandardOutput=journal
Restart=always
StartLimitInterval=60s
RestartSec=45s
[Install]
WantedBy=multi-user.target
当我执行 service xyz start --> 时,它会执行启动功能,但是当我执行 service xyz status --> 时,它仍然显示正在激活。
答案1
当 systemd 服务管理器仍在等待进程启动时,就会发生这种行为。我通常会在以下情况下看到此内容:
ExecStartPre=
挂起Type=notify
存在但ExecStart=
不调用 sd-notify
我通常不使用PIDFile=
,但它通常Type=forking
在您使用时与 一起使用Type=simple
。这就是让我怀疑的地方PIDFile=
。
man systemd.service
说的是PIDFile
:
服务启动后,服务管理器会从该文件中读取该服务主进程的PID。
我无法重现缺少 PIDFile 的问题,但我仍然怀疑 systemd 服务管理器正在等待PIDFile=
填充主进程的 PID,然后才将单元视为activated
.如果您的服务很复杂,那么 systemd 在确定要跟踪哪个 PID 时可能会遇到一些问题。该进程可能Type=simple
没有将其 PID 写入该文件。