linux 向systemd添加python守护进程

h7appiyu  于 2023-08-03  发布在  Linux
关注(0)|答案(2)|浏览(133)

本质:
我创建了一个守护进程来管理远程平台上的一些任务。它是用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)

字符串
具体情况:
代码本身遵循了Sander Marechal的著名example,只做了很少的改动。它本身没有任何问题,并对所有公认的论点作出适当的React。pid保存在/tmp/my-daemon.pid中。
systemd服务文件位于user 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返回其状态为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的经验,如果有人能为我指出它或告诉我正确的方向,我将非常感激。提前感谢,请原谅我疯狂的英语技能。

v64noz0r

v64noz0r1#

启用具有完整路径名的守护程序可以解决此问题,但有一个更好的解决方案。
问题是服务位于 user 目录中,但作为 system 服务启动。但是,/usr/lib 并不是添加新 service 文件的正确位置。该目录用于作为操作系统包的一部分提供的文件。添加新 system 服务的正确目录在 /etc/systemd/system 中。
您仍然需要enable服务,以确保它在 Boot 时加载。

uwopmtnx

uwopmtnx2#

以下是一个解决方案,并不是问题的真实的解决方案。请参阅已接受的答案。

在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:

[root@centos ~]# systemctl daemon-reload


然后添加服务,以及

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


一切都很完美。

相关问题