Systemd는 실패한 서비스 다시 시작을 지연하고 30개의 절전 시간을 추가하는 것으로 보입니다.

Systemd는 실패한 서비스 다시 시작을 지연하고 30개의 절전 시간을 추가하는 것으로 보입니다.

(원래 stackoverflow에 게시했지만 여기로 이동하라는 요청을 받았습니다.) Python 데몬이 서비스로 실행되고 있으며 때로는 그 중 여러 개가 동일한 기능이 필요한 다른 프로세스(p0, p1 등)에 대해 실행되고 있습니다. 서비스가 실패하면 서비스가 다시 시작되는 데 2~3분 정도의 오랜 시간이 걸리는 경우도 있습니다. 일반적으로 몇 초 내에 서비스가 정상으로 돌아오는 것을 볼 수 있습니다.

kill -9systemctl status myapplication@p1systemd가 서비스를 다시 시작하는지 테스트하고 서비스가 다시 실행될 때까지(3개는 실행 중) 30초마다 인쇄하는지 테스트하기 위해 프로세스에서 스크립트를 실행했습니다 . 상태 메시지가 끝날 때 하나 이상의 서비스가 복구하는 데 예상보다 오래 걸리는 경우 sleep 30이는 CGroup 끝에 나타나고 해당 PID는 각 명령 호출 사이에 변경됩니다 status.

    * myapplication.service - my application service for p1.
     Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
     Active: activating (start) since Fri 2022-03-25 14:48:27 UTC; 26s ago
Cntrl PID: 1335258 (myapplication)
      Tasks: 5 (limit: 9505)
     Memory: 3.3M
        CPU: 1.442s
     CGroup: /system.slice/system-myapplication.slice/[email protected]
             |-1335258 /bin/bash /path/to/application/myapplication start p1
             |-1336794 sudo -u admin -i python /path/to/application/myapplication.py start p1
             |-1336795 logger
             |-1336802 -bash --login -c python \/path\/to\/application/myapplication\.py start p1
             `-1336830 sleep 30



* myapplication.service - my application service for p1.
     Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
     Active: activating (start) since Fri 2022-03-25 14:48:27 UTC; 56s ago
Cntrl PID: 1335258 (myapplication)
      Tasks: 5 (limit: 9505)
     Memory: 3.3M
        CPU: 1.444s
     CGroup: /system.slice/system-myapplication.slice/[email protected]
             |-1335258 /bin/bash /path/to/application/myapplication start p1
             |-1336794 sudo -u admin -i python /path/to/application/myapplication.py start
             |-1336795 logger
             |-1336802 -bash --login -c python \/path\/to\/application/myapplication\.py start p1
             `-1336919 sleep 30



* myapplication.service - my application service for p1.
     Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
     Active: activating (start) since Fri 2022-03-25 14:48:27 UTC; 1min 26s ago
Cntrl PID: 1335258 (myapplication)
      Tasks: 5 (limit: 9505)
     Memory: 3.3M
        CPU: 1.447s
     CGroup: /system.slice/system-myapplication.slice/[email protected]
             |-1335258 /bin/bash /path/to/application/myapplication start p1
             |-1336794 sudo -u admin -i python /path/to/application/myapplication.py start p1
             |-1336795 logger
             |-1336802 -bash --login -c python \/path\/to\/application/myapplication\.py start p1
             `-1336998 sleep 30



* myapplication.service - my application service for p1.
     Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2022-03-25 14:49:58 UTC; 25s ago
    Process: 1337069 ExecStart=/path/to/application/myapplication start (code=exited, status=0/SUCCESS)
   Main PID: 1337603 (python)
      Tasks: 6 (limit: 9505)
     Memory: 7.2M
        CPU: 1.541s
     CGroup: /system.slice/system-myapplication.slice/[email protected]
             |-1337603 python /path/to/application/myapplication.py start p1
             |-1337659 /bin/sh -c sudo timeout 15 sudo tcpdump -n -i lo udp port 1234 2> /tmp/capture.txt > /dev/null
             |-1337660 sudo timeout 15 sudo tcpdump -n -i lo udp port 1234
             |-1337662 timeout 15 sudo tcpdump -n -i lo udp port 1234
             |-1337663 sudo tcpdump -n -i lo udp port 6343
             `-1337664 tcpdump -n -i lo udp port 6343

내 유닛 파일에는 재시작 지연이 없습니다.

[Unit]
Description=my application service for %i.

[Service]
Type=forking
ExecStart=/path/to/application/myapplication start
ExecStop=/path/to/application/myapplication stop
ExecReload=/path/to/application/myapplication restart
Restart=always

[Install]
WantedBy=multi-user.target

정기적으로 발생하지 않고 때로는 발생하고 때로는 발생하지 않는데 왜 이러한 지연이 발생합니까? 수면 PID가 변경되는 이유는 무엇입니까? 처음에는 재부팅 후 새로운 절전 모드를 시도하는 것이라고 생각했지만 출력을 보면 status재부팅이 없으며 Active: activating (start) ...서비스가 재부팅될 때까지 시간이 동일하게 유지됩니다.


지금은 이 작업을 조금 했는데 분리할 때 kill명령을 한 줄로 실행했기 때문에 그럴 수도 있다고 생각합니다.kill -9 <p1-PID> <p2-PID> <p3-PID>

kill -9 <p1-PID>
kill -9 <p2-PID>
kill -9 <p3-PID>

봉사를 위해 30시간 동안 잠도 못 자겠습니다. 확실히 알기 위해서는 더 많은 테스트가 필요하지만 현재로서는 그 모습입니다.

sleep 30그런데 왜 나타나는지 아직도 궁금합니다 .

답변1

귀하 의 서비스 에는 Type=forking. 서비스가 실행되는 동안 존재합니다 . 완료 되면 생성된 프로세스( )가 선택되어 이 상태로 들어갑니다.ExecStart=fork()activating (start)ExecStart=ExecStart=systemdMainPIDactive (running)

귀하의 ExecStart=프로그램은 bash 스크립트인 것 같습니다. 스크립트는 다음과 같습니다.

#!/bin/bash
sudo -u admin -i python /path/to/application/myapplication.py start p1 | logger &

while /bin/true; do
    sleep 30
done

스크립트에 몇 가지 문제가 있지만 관심을 가질 부분은 sleep 30마지막 부분입니다. 기본 프로세스가 실행 중이지만 systemd는 active (running)완료될 때까지 해당 상태로 들어가지 않습니다 sleep 30. 새 PID가 sleep 30계속 호출되므로 매번 새 PID가 표시됩니다 .

잘 작동하는 스크립트는 애플리케이션을 생성한 후 즉시 종료됩니다. 스크립트는 애플리케이션이 종료되기 전에 올바르게 시작되었다는 피드백을 기다리고 있을 수 있습니다. 이는 괜찮지만, 기다리고 있는 피드백을 확실히 얻지 못하고 있으므로 그렇지 않은 이유를 알아내기 위해 더 깊이 파고들어야 합니다.

그러나 내 생각에는 스크립트가 응용 프로그램이 종료되기 전에 종료되기를 기다리고 있을 가능성이 더 높습니다. 이 같은:

python myapplication.py &
PID=$!

while ps | grep -q $PID; do
    sleep 30
done

대본 이 아닌 당신 kill이 하고 있는 것처럼 들리기 때문인 것 같아요 . 이는 장치가 완료될 때까지 그대로 유지된다는 의미입니다 . 그런 다음 스크립트가 중지되기 전에 Python 애플리케이션의 PID가 여전히 존재하는지(존재하지 않는지) 확인합니다.pythonExecStart=activating (start)sleep 30

나를 괴롭히는 또 다른 스크립트 부분은 대화형 사용자를 인증하기 위한 sudosudo입니다. 스크립트의 유효성을 검사하기 위한 것이 아닙니다. 대신, 더 우아한 솔루션은 User=admin서비스 내에서 이를 사용하는 것입니다.

두 가지 해결책이 있습니다. 옵션 2는 내가 가장 좋아하는 것입니다.

  1. 루프를 편집 /path/to/application/myapplication하고 삭제합니다 while.
  2. 간단한 서비스를 사용하고 스크립트를 완전히 건너뛰세요. 이는 다른 초기화 시스템(현재는 필요하지 않은 자체 로거를 명시적으로 시작함)을 위해 작성된 다음 셸에서 호출될 때 차단되도록 수정된 것처럼 보입니다. systemd이 모든 작업은 귀하를 위해 수행되었으므로 스크립트가 전혀 필요하지 않을 것입니다.
[Unit]
Description=my application service for %i.

[Service]
Type=simple
ExecStart=/usr/bin/python3 /path/to/application/myapplication.py %i
User=admin
Restart=always

[Install]
WantedBy=multi-user.target

도움이 되지 않으면 게시해 주세요./path/to/application/myapplication

관련 정보