systemd - 停止せずに再起動

systemd - 停止せずに再起動

少し問題があります。内部的には、複数のプログラム(client1、client2、client3)を起動および分離するプログラム(マスターと呼びます)があります。

メインプログラムは常にオンラインにしておきたいので、次のようにシステムサービスファイルを作成しました。

[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はrestartコマンドの代わりにExecStopを実行してすべてのクライアントを終了します。

私が望むことを達成する方法はありますか?

ありがとう

PS。 Debian 8.6.0 x64 を使用しています

ベストアンサー1

systemdには再起動という概念がなく、再起動は単純な実行後に停止+開始以上です。再起動する代わりにExecReload=thenを使用することもできますが、systemctl reload問題はなぜこれが必要なのかということです。

クライアントを再起動するのではなく、マスターを再起動するのはなぜですか?それで、マスターは何をしますか?あなたのスタートアップスクリプトはあなたがプロセス監督をやり直そうとしていると信じています。私はこれに反対することをお勧めします。 systemdはこれを行うことができるので、それを使用してください。

systemdを介してクライアントを起動する方法を見つけることをお勧めします。

とにかく起動スクリプトは完全に冗長です。 systemdはすでにこれらすべての操作を実行できるため、完全に不要なPIDファイルとすべての種類のエントリを使用します。これを削除し、.serviceファイルで「ExecStart = / home / user / master」を使用し(マスターが必要な場合)、Type =を「forking」から「simple」に調整することをお勧めします。 「ExecStop」と「PIDFile」を削除してください。

私はお勧めしますhttps://jdebp.eu/FGA/systemd-house-of-horror/tomcat.html詳細を読むには。

おすすめ記事