【发布时间】:2019-02-13 13:51:48
【问题描述】:
我用 Python 写了一个小守护进程:
#!/usr/bin/python3
import time
import click
import daemonocle
from daemonocle.cli import DaemonCLI
@click.command(cls=DaemonCLI, daemon_params={'pidfile': '/var/run/daemon.pid'})
def main():
while True:
time.sleep(3)
if __name__ == '__main__':
main()
它按原样工作得很好。如果我执行以下操作,我将获得良好的退出状态0
$ sudo ./daemon start
Starting daemon ... OK
$ echo $?
0
然后我写了一个systemd服务文件:
[Unit]
SourcePath=/home/pi/daemon/daemon
Description=My First Daemon
Before=multi-user.target
After=mosquitto.target
[Service]
Type=forking
PIDFile=/var/run/daemon.pid
Restart=no
ExecStart=/home/pi/daemon/daemon start
ExecStop=/home/pi/daemon/daemon stop
ExecReload=/home/pi/daemon/daemon reload
如果我尝试使用systemctl 运行我的守护进程,命令仍处于阻塞状态:
$ sudo systemctl start daemon
^C
$ sudo systemctl status daemon
? daemon.service - XEMWAY Demo Service
Loaded: loaded (/home/pi/daemon/daemon; static; vendor preset: enabled)
Active: activating (start) since Wed 2019-02-13 13:47:40 GMT; 12s ago
Process: 13044 ExecStop=/home/pi/daemon/daemon stop (code=exited, status=0/SUCCESS)
Main PID: 12304 (code=exited, status=143); Control PID: 13079 (daemon)
CGroup: /system.slice/daemon.service
+-13079 /usr/bin/python3 /home/pi/daemon/daemon start
+-13081 /usr/bin/python3 /home/pi/daemon/daemon start
一分钟后systemd 说:
2 月 13 日 13:49:10 raspberrypi systemd[1]:daemon.service:单元进入失败状态。 2 月 13 日 13:49:10 raspberrypi systemd[1]: daemon.service: 失败,结果为“超时”。
这是怎么回事?
【问题讨论】:
-
也许使用
one-shot比使用forking更容易并且不要分叉? -
不,不是因为我的脚本已经是一个守护进程
-
systemd 和其他服务监控工具,确实更喜欢不分叉的守护进程。如果您更改您的守护程序或向其添加一个标志,以便它不会从第一个进程分叉,那么您可以将其设置为 Type=simple,它不需要 PID 文件或任何东西。
标签: python linux daemon systemd