systemd
시작할 때 쉘 스크립트를 실행하고 start.sh
궁극적으로 main.py
프로그램을 시작하는 데 사용하는 기본 Python 스크립트입니다.
main.py
나중에 프로그래밍 방식으로 PID를 종료할 수 있도록 PID를 기록하고 싶습니다 .
먼저 다음을 시도했지만 PID가 기록되었음에도 불구하고 Python 스크립트가 활성 상태로 유지되지 않는 것을 발견했습니다(오류 출력을 로그 파일로 리디렉션했습니다).
sudo python main.py 2> >(sudo tee /var/log/app.log) &
echo $1 > /tmp/app.pid
그러나 삭제되면 &
스크립트는 활성 상태로 유지되지만 PID 스크립트는 PID가 기록되는 줄에 도달하지 않습니다.
sudo python main.py 2> >(sudo tee /var/log/app.log)
echo $1 > /tmp/app.pid
main.py
활성 상태를 유지하면서도 여전히 PID를 제공하는 방식으로 실행하려면 어떻게 해야 합니까 ?
답변1
간단한 예를 들어,exec
exec
현재 프로세스의 실행 파일을 다른 실행 파일로 바꿉니다.
sudo bash -c ' echo $$ > /var/run/app.pid ; exec python3 -u /tmp/main.py > /var/log/app.log 2>&1 '
그런 다음 다음을 통해 확인할 수 있습니다.
cat /var/run/app.pid ; ps -ax -o pid,uname,args | grep "^ *$(cat /var/run/app.pid)"
답변2
Fubar가 언급한 의견을 바탕으로 상위 스레드가 내가 종료해야 하는 프로세스인 것으로 밝혀졌기 때문에 이것이 내가 필요한 작업을 수행한다는 os.getpid()
것을 알았습니다 .os.getppid()
PID = str(os.getppid())
with open(‘app.pid’, ‘w’) as file:
file.write(PID)
그런 다음 나중에 스크립트에서 다음을 사용하여 종료할 수 있습니다.
sudo kill `cat /tmp/app.pid`
sudo
원래 Python 스크립트 가 sudo
.