我创建了一个自定义服务文件,如下所示:
[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
Run Code Online (Sandbox Code Playgroud)
检查状态时:
systemctl status aaa
Run Code Online (Sandbox Code Playgroud)
一切看起来都不错,除了:
... systemd[1]: aaa.service: Supervising process 18285 which is not our child. We'll most likely not notice when it exits.
Run Code Online (Sandbox Code Playgroud)
想知道为什么会显示此消息以及是否需要关注?
我的 ExecStart 是一个名为 run_aaa.sh 的 bash 脚本;它所做的是准备一些环境变量,运行一些必需的维护脚本,最后在后台运行带有一些动态命令行选项的 aaa 二进制文件(作为守护进程) - 然后退出(run_aaa.sh 脚本退出,aaa 守护进程) binary 在后台继续运行,并维护自己的 pid 文件,systemd 知道)
我知道 systemd 正在运行 run_aaa.sh 并期望它分叉(因为我指定了 type=forking)并且它实际上通过在后台运行“aaa”二进制守护程序并随后退出来“分叉”。另外,我确实指定了 PIDFile 路径,并且我的 aaa 二进制文件按原样维护了这个 PIDFile,那么为什么 systemd 会抱怨它可能无法监督我的守护进程?
有没有更好的方法来为这个用例配置服务?(我必须使用 run_aaa.sh 脚本来执行我的二进制文件)