(원래 stackoverflow에 게시했지만 여기로 이동하라는 요청을 받았습니다.) Python 데몬이 서비스로 실행되고 있으며 때로는 그 중 여러 개가 동일한 기능이 필요한 다른 프로세스(p0, p1 등)에 대해 실행되고 있습니다. 서비스가 실패하면 서비스가 다시 시작되는 데 2~3분 정도의 오랜 시간이 걸리는 경우도 있습니다. 일반적으로 몇 초 내에 서비스가 정상으로 돌아오는 것을 볼 수 있습니다.
kill -9
systemctl status myapplication@p1
systemd가 서비스를 다시 시작하는지 테스트하고 서비스가 다시 실행될 때까지(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=
systemd
MainPID
active (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가 여전히 존재하는지(존재하지 않는지) 확인합니다.python
ExecStart=
activating (start)
sleep 30
나를 괴롭히는 또 다른 스크립트 부분은 대화형 사용자를 인증하기 위한 sudo
것 sudo
입니다. 스크립트의 유효성을 검사하기 위한 것이 아닙니다. 대신, 더 우아한 솔루션은 User=admin
서비스 내에서 이를 사용하는 것입니다.
두 가지 해결책이 있습니다. 옵션 2는 내가 가장 좋아하는 것입니다.
- 루프를 편집
/path/to/application/myapplication
하고 삭제합니다while
. - 간단한 서비스를 사용하고 스크립트를 완전히 건너뛰세요. 이는 다른 초기화 시스템(현재는 필요하지 않은 자체 로거를 명시적으로 시작함)을 위해 작성된 다음 셸에서 호출될 때 차단되도록 수정된 것처럼 보입니다.
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