Systemd:监督进程XXXX,这不是我们的孩子。 我们很可能不会注意到什么时候退出

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

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脚本; 它所做的是准备一些环境variables,运行一些必需的维护脚本,最后在后台运行带有一些dynamic命令行选项的aaa二进制文件(作为守护进程) – 然后退出(run_aaa.sh脚本退出,aaa守护进程二进制文件继续在后台运行,并维护系统知道的自己的PID文件)

我知道systemd正在运行run_aaa.sh,并期望它fork(因为我指定了type = forking),它实际上是通过在后台运行“aaa”二进制守护进程并在之后退出来实现“fork”。 另外我指定了PIDFilepath,我的aaa二进制文件维护了这个PIDFile,所以为什么systemd会抱怨它可能无法监督我的守护进程?

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

您可能会尝试删除不需要的PIDFile。 或者在脚本中使用exec运行你的二进制文件。

如果你开始你的服务,aaa二进制文件的父PID是什么? 是PID 1还是你的shell脚本,还没有退出?