将python守护程序添加到systemd

时间:2016-05-17 12:53:35

标签: python linux daemon centos7 systemd

本质:

我已经创建了一个守护进程来管理远程平台上的一些任务。 它是用python编写的,接受start,stop和restart参数。 在尝试将其添加到systemd时(因此它将在系统启动时启动并在关闭时停止等)我遇到了一个问题: 它似乎看到守护进程正在运行,但我不确定它是否真的有效,因为重新启动或请求状态会返回错误:

SceneManager.LoadScene(1);

细节:

代码本身遵循Sander Marechal着名的example,只有很少的变化。它本身可以毫无问题地工作,并对所有被接受的参数作出适当的反应。 pid保存在[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)

systemd服务文件位于用户守护程序目录中:/tmp/my-daemon.pid,代码如下:

/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 将其状态返回为活动状态,但仅在提供pid:

时才会返回
systemctl

我在堆栈溢出时看到similar question,但它似乎没有解决我的问题。

我认为由于缺乏对systemd的缺乏经验,我遗漏了一些非常明显的事情,如果有人能为我指出或向我展示正确的行动方向,我将非常感激。在此先感谢,请原谅我疯狂的英语技巧。

2 个答案:

答案 0 :(得分:2)

使用完整路径名启用守护程序可解决此问题,但有一个更好的解决方案。

问题是该服务位于用户目录中,但是作为系统服务启动。但是,无论如何, / usr / lib 都不是添加新服务文件的正确位置。该目录适用于作为操作系统软件包的一部分提供的文件。添加新系统服务的正确目录位于 / etc / systemd / system 中,请参阅related docs about systemd paths

您仍然希望enable服务以确保它在启动时加载。

答案 1 :(得分:0)

经过一些额外的谷歌搜索后,我找到了一个解决方案:我实际上忘了将守护进程添加到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

一切都很完美。