向systemd添加python守护进程

2024-04-29 03:47:51 发布

您现在位置:Python中文网/ 问答频道 /正文

精髓:

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

[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)

具体内容:

代码本身遵循了著名的sandermarechal的example,只做了很少的修改。它本身工作没有任何问题,并且对所有公认的论据都作出了适当的反应。pid保存在/tmp/my-daemon.pid。在

systemd服务文件位于用户守护程序目录中:/usr/lib/systemd/user/mydaemon.service,代码如下:

^{pr2}$

systemctl将其状态返回为active,但前提是提供了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的经验,我可能会错过一些非常明显的东西,如果有人能为我指出这一点,或者告诉我正确的方向,我将不胜感激。提前谢谢,请原谅我疯狂的英语技巧。在


Tags: 进程session状态confstatusservicepidstart
2条回答

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

^{pr2}$

之后,服务被添加,并且

[root@centos ~]# systemctl start mydaemon
[root@centos ~]# systemctl restart mydaemon
[root@centos ~]# systemctl stop mydaemon

一切都很完美。在

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

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

您仍然需要enable该服务以确保它在启动时被加载。在

相关问题 更多 >