使用 systemd 服务执行守护进程不会返回

使用 systemd 服务执行守护进程不会返回

我正在尝试从 systemd 服务执行守护程序程序,但是当我从命令提示符启动脚本时,无论是手动(systemctl start)还是作为 debian 安装的一部分(dpkg -i myapp.deb),命令执行都会执行不返回到命令提示符。

[Unit]
Description=MyDaemon
After=NetworkManager.service

[Service]
WorkingDirectory=/usr/local/bin/my-daemon
ExecStart=/usr/local/bin/my-daemon/my-daemon
Type=forking

[Install]
WantedBy=default.target

我可以确认执行的守护程序本身不会“返回”,因为它是守护程序。另外,当我重新启动系统时,该服务成功运行守护程序。

然而,我期望当从“systemctl start”启动服务时,该服务将在后台运行守护进程,并返回到命令提示符,特别是在指定“Type=forking”之后。我也尝试过设置“Type=Simple”,但结果是相同的。

我看过 使用 systemd 创建守护进程的方法有哪些?Systemd服务运行而不退出但这些都不能解决我的问题。

如果有人可以提供帮助,那就太好了。

谢谢。

答案1

我昨晚刚刚处理了这个确切的问题。需要解决两件事。由于 systemd 与登录的超级用户之间的 selinux 策略和环境变量可能有很大不同,因此在命令行上进行测试可能会产生误报。通过实施 selinux,差异可能是巨大的。 systemd 不会失败,而是尝试无限期地运行它,等待成功(退出 0)。因此,要深入了解它,请运行 systemctl start my-daemon,然后运行 ​​CTL + C 取消服务启动,然后运行 ​​systemctl status my-daemon。状态肯定会显示失败的原因以及尚未退出的原因。

另一件事是在[service]部分下,除了其他参数之外,使用

Type=simple
RemainAfterExit=no

尽管 Type=forking 可能适合您的工作。

相关内容