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을 수행하여 모든 클라이언트도 종료합니다.

내가 원하는 것을 달성할 수 있는 방법이 있나요?

감사합니다

추신. 데비안 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자세한 내용을 읽으려면.

관련 정보