cat /etc/systemd/system/aaa.service

cat /etc/systemd/system/aaa.service

我创建了一个自定义服务文件,如下所示:

cat /etc/systemd/system/aaa.service

[Unit]
Description=aaa main application
After=syslog.target network-online.target

[Service]
Type=forking
PIDFile=/usr/local/aaa_path/aaa/aaa.pid
WorkingDirectory=/usr/local/aaa_path/aaa/
ExecStart=/usr/local/aaa_path/aaa/run_aaa.sh
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

使用以下方式检查状态时:

systemctl status aaa

一切看起来都很好,除了:

... systemd[1]: aaa.service: Supervising process 18285 which is not our child. We'll most likely not notice when it exits.

想知道为什么会显示此消息以及是否有任何需要担心的事情?

我的 ExecStart 是一个名为 run_aaa.sh 的 bash 脚本;它的作用是准备一些环境变量,运行一些必需的维护脚本,最后在后台使用一些动态命令行选项运行 aaa 二进制文件(作为守护进程) - 然后退出(run_aaa.sh 脚本退出,aaa 守护进程二进制文件继续在后台运行,并维护 systemd 知道的自己的 pid 文件)

我知道 systemd 正在运行 run_aaa.sh 并期望它进行分叉(因为我指定了 type=forking),并且它确实通过在后台运行“aaa”二进制守护程序并随后退出来“分叉”。另外,我确实指定了 PIDFile 路径,并且我的 aaa 二进制文件按应有的方式维护此 PIDFile,那么为什么 systemd 会抱怨它可能无法监督我的守护程序呢?

有没有更好的方法来为这个用例配置服务?(我必须使用 run_aaa.sh 脚本才能执行我的二进制文件)

答案1

如果你只需要运行一次 shell 脚本,那么只需使用 添加ExecStartPre=/path/to/script并运行守护进程ExecStart=/path/to/daemon即可。该脚本不会在重新启动时运行,也许这不是你所需要的。

如果您还需要在重启时运行该脚本,则请Type=simple从 shell 脚本中以前台模式设置并运行守护进程,这样脚本就不会退出。但您仍然会收到该消息,并且停止/重新启动操作在 之前要等待 30 秒State 'stop-sigterm' timed out. Killing,非常不愉快。如果您随后添加ExecStop=/bin/kill $MAINPID,超时问题就会消失。不要删除PIDFile。您仍然会看到该消息,但每个操作启动/停止/重新启动/状态都能正常工作。也许还有其他更好的方法来实现相同的效果。至少这对我有用,并且可以安全地忽略该消息。当守护进程退出时,shell 脚本也将退出,因此 systemd 会知道这一点。

相关内容