我有一个小问题。我有一个程序(我们称之为 master),它在内部启动多个程序(client1、client2 和 client3)并分离它们。
现在,我希望主程序始终保持在线,所以我写了一个这样的systemd服务文件:
[Unit]
Description=Run the master
Before=runlevel2.target runlevel3.target runlevel4.target runlevel5.target
After=remote-fs.target systemd-journald-dev-log.socket all.target
[Service]
Type=forking
Restart=always
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
RemainAfterExit=no
SysVStartPriority=5
ExecStart=/home/user/start_master.sh start
ExecStop=/home/user/start_master.sh stop
PIDFile=/var/run/mymaster.pid
[Install]
WantedBy=multi-user.target
启动脚本如下所示:
#! /bin/sh
PIDFILE=/var/run/mymaster.pid
do_start() {
/home/user/master >/dev/null 2>&1 &
echo $!
}
case "$1" in
start)
PID=$(do_start)
if [ -z $PID ]; then
echo "Failed starting master"
exit 2
else
echo $PID > $PIDFILE
fi
;;
stop)
killall master client1 client2 client3 2>/dev/null
rm $PIDFILE
;;
restart)
killall master 2>/dev/null
$0 start
;;
*)
echo "Usage: $0 start|stop|restart" >&2
exit 3
;;
esac
我想要的行为是:
- 启动时:只需启动主服务器(它将负责启动客户端)
- 重新启动时(或当主程序关闭时):终止主程序并重新启动它(因为它将附加到以前的客户端)
- 停止时:杀死主程序和所有客户端
现在,通过此设置,一切正常:当我启动服务时,这就是我看到的:
$ systemctl status master.service
● master.service - Run the master
Loaded: loaded (/etc/systemd/system/master.service; enabled)
Active: active (running) since Wed 2016-10-19 16:16:33 CEST; 5s ago
Process: 4161 ExecStop=/home/user/start_master.sh stop (code=exited, status=0/SUCCESS)
Process: 4198 ExecStart=/home/user/start_master.sh start (code=exited, status=0/SUCCESS)
Main PID: 4200 (master)
CGroup: /system.slice/master.service
├─4200 /home/user/master
├─4203 /home/user/client1
├─4205 /home/user/client2
└─4209 /home/user/client3
车站也运行良好。但是...当我想重新启动它时(通过调用 restart 或手动终止主程序)systemd 执行 ExecStop 而不是重新启动命令,从而也终止了所有客户端。
有办法实现我想要的吗?
此致
附言。我使用的是 Debian 8.6.0 x64
答案1
systemd 没有重新启动的概念,而重新启动不仅仅是停止-如果-运行+启动。您也许可以使用ExecReload=
然后使用systemctl reload
而不是重新启动,但问题是为什么需要这个?
为什么要重启master而不重启clients?那么,主人到底是做什么的呢?你的启动脚本让我相信你正在尝试再次进行进程监督,我建议不要这样做 - systemd 可以做到这一点,所以使用它。
我建议您尝试弄清楚如何通过 systemd 启动客户端。
无论如何,您的启动脚本是完全多余的。它使用 PID 文件和各种完全不必要的东西,因为 systemd 已经可以做所有这些事情了。我建议删除它,而只是在 .service 文件中使用“ExecStart=/home/user/master”(如果 master 是必需的),然后将 Type= 从“forking”调整为“simple”。删除“ExecStop”和“PIDFile”。
我建议https://jdebp.eu/FGA/systemd-house-of-horror/tomcat.html作为进一步阅读。