systemd - 重新启动而不停止

systemd - 重新启动而不停止

我有一个小问题。我有一个程序(我们称之为 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作为进一步阅读。

相关内容