本质:
我已经创建了一个守护进程来管理远程平台上的一些任务。 它是用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的缺乏经验,我遗漏了一些非常明显的事情,如果有人能为我指出或向我展示正确的行动方向,我将非常感激。在此先感谢,请原谅我疯狂的英语技巧。
答案 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
一切都很完美。