向 systemd 添加 python 守护进程
Adding a python daemon to the systemd
精华:
我创建了一个守护进程来管理远程平台上的一些任务。
它写在 python 中并接受开始、停止和重新启动参数。
在尝试将它添加到 systemd 时(这样它会在系统启动时启动并在关机时停止,等等)我遇到了一个问题:
好像看到守护进程运行,但我不确定它是否真的有效,因为重新启动或请求状态returns错误:
[user@centos ~]# systemctl restart mydaemon
Failed to restart mydaemon.service: Unit mydaemon.service failed to load: No such file or directory.
[user@centos ~]# systemctl status mydaemon
● mydaemon.service
Loaded: not-found (Reason: No such file or directory)
Active: inactive (dead)
具体情况:
代码本身沿用了 Sander Marechal 著名的 example,只有很少的改动。它本身没有任何问题,并且对所有公认的论点做出正确的反应。 pid 保存在 /tmp/my-daemon.pid
.
systemd服务文件在用户daemons目录下:/usr/lib/systemd/user/mydaemon.service
,代码如下:
[Unit]
Description=The user daemon
[Service]
Type=forking
ExecStart=/usr/bin/python /home/frcr/mydaemon_v01.py start
ExecStop=/usr/bin/python /home/frcr/mydaemon_v01.py stop
RestartSec=5
TimeoutSec=60
RuntimeMaxSec=infinity
Restart=always
PIDFile=/tmp/my-daemon.pid
[Install]
WantedBy=multi-user.target
systemctl
returns 它的状态是活动的,但前提是提供了 pid:
[user@centos ~]# systemctl status 9177
● session-481.scope - Session 481 of user user
Loaded: loaded
Drop-In: /run/systemd/system/session-481.scope.d
└─50-After-systemd-logind\x2eservice.conf, 50-After-systemd-user-sessions\x2eservice.conf, 50-Description.conf, 50-SendSIGHUP.conf, 50-Slice.conf
Active: active (running) since Tue 2016-05-17 06:24:51 EDT; 1h 43min ago
CGroup: /user.slice/user-0.slice/session-481.scope
├─8815 sshd: root@pts/0
├─8817 -bash
├─9177 python /home/user/mydaemon_v01.py start
└─9357 systemctl status 9177
我在这里看到了一个关于堆栈溢出的similar question,但它似乎没有解决我的问题。
我认为由于完全缺乏 systemd 经验,我遗漏了一些非常明显的东西,如果有人能为我指出它或告诉我正确的前进方向,我将非常感激。提前致谢,请原谅我疯狂的英语技能。
经过一些额外的谷歌搜索后,我找到了一个解决方案:我实际上忘记将守护进程添加到 systemctl
:
[root@centos ~]# systemctl enable /usr/lib/systemd/user/mydaemon.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mydaemon.service to /usr/lib/systemd/user/mydaemon.service.
Created symlink from /etc/systemd/system/mydaemon.service to /usr/lib/systemd/user/mydaemon.service.
另外值得一提的是需要绝对路径
只剩下刷新systemctl了:
[root@centos ~]# systemctl daemon-reload
添加服务后,
[root@centos ~]# systemctl start mydaemon
[root@centos ~]# systemctl restart mydaemon
[root@centos ~]# systemctl stop mydaemon
一切都很完美。
启用具有完整路径名的守护进程解决了这个问题,但还有更好的解决方案。
问题是该服务位于 user 目录中,但作为 system 服务启动。但是 /usr/lib 无论如何都不是添加新 service 文件的正确位置。该目录用于作为操作系统包的一部分提供的文件。添加新 system 服务的正确目录位于 /etc/systemd/system 参见 related docs about systemd paths.
您仍然希望 enable
该服务以确保它在启动时加载。
精华:
我创建了一个守护进程来管理远程平台上的一些任务。 它写在 python 中并接受开始、停止和重新启动参数。 在尝试将它添加到 systemd 时(这样它会在系统启动时启动并在关机时停止,等等)我遇到了一个问题: 好像看到守护进程运行,但我不确定它是否真的有效,因为重新启动或请求状态returns错误:
[user@centos ~]# systemctl restart mydaemon
Failed to restart mydaemon.service: Unit mydaemon.service failed to load: No such file or directory.
[user@centos ~]# systemctl status mydaemon
● mydaemon.service
Loaded: not-found (Reason: No such file or directory)
Active: inactive (dead)
具体情况:
代码本身沿用了 Sander Marechal 著名的 example,只有很少的改动。它本身没有任何问题,并且对所有公认的论点做出正确的反应。 pid 保存在 /tmp/my-daemon.pid
.
systemd服务文件在用户daemons目录下:/usr/lib/systemd/user/mydaemon.service
,代码如下:
[Unit]
Description=The user daemon
[Service]
Type=forking
ExecStart=/usr/bin/python /home/frcr/mydaemon_v01.py start
ExecStop=/usr/bin/python /home/frcr/mydaemon_v01.py stop
RestartSec=5
TimeoutSec=60
RuntimeMaxSec=infinity
Restart=always
PIDFile=/tmp/my-daemon.pid
[Install]
WantedBy=multi-user.target
systemctl
returns 它的状态是活动的,但前提是提供了 pid:
[user@centos ~]# systemctl status 9177
● session-481.scope - Session 481 of user user
Loaded: loaded
Drop-In: /run/systemd/system/session-481.scope.d
└─50-After-systemd-logind\x2eservice.conf, 50-After-systemd-user-sessions\x2eservice.conf, 50-Description.conf, 50-SendSIGHUP.conf, 50-Slice.conf
Active: active (running) since Tue 2016-05-17 06:24:51 EDT; 1h 43min ago
CGroup: /user.slice/user-0.slice/session-481.scope
├─8815 sshd: root@pts/0
├─8817 -bash
├─9177 python /home/user/mydaemon_v01.py start
└─9357 systemctl status 9177
我在这里看到了一个关于堆栈溢出的similar question,但它似乎没有解决我的问题。
我认为由于完全缺乏 systemd 经验,我遗漏了一些非常明显的东西,如果有人能为我指出它或告诉我正确的前进方向,我将非常感激。提前致谢,请原谅我疯狂的英语技能。
经过一些额外的谷歌搜索后,我找到了一个解决方案:我实际上忘记将守护进程添加到 systemctl
:
[root@centos ~]# systemctl enable /usr/lib/systemd/user/mydaemon.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mydaemon.service to /usr/lib/systemd/user/mydaemon.service.
Created symlink from /etc/systemd/system/mydaemon.service to /usr/lib/systemd/user/mydaemon.service.
另外值得一提的是需要绝对路径
只剩下刷新systemctl了:
[root@centos ~]# systemctl daemon-reload
添加服务后,
[root@centos ~]# systemctl start mydaemon
[root@centos ~]# systemctl restart mydaemon
[root@centos ~]# systemctl stop mydaemon
一切都很完美。
启用具有完整路径名的守护进程解决了这个问题,但还有更好的解决方案。
问题是该服务位于 user 目录中,但作为 system 服务启动。但是 /usr/lib 无论如何都不是添加新 service 文件的正确位置。该目录用于作为操作系统包的一部分提供的文件。添加新 system 服务的正确目录位于 /etc/systemd/system 参见 related docs about systemd paths.
您仍然希望 enable
该服务以确保它在启动时加载。