systemd를 통해 스크립트를 통해 시작된 진행 중인 Python 프로세스의 PID를 가져옵니다.

systemd를 통해 스크립트를 통해 시작된 진행 중인 Python 프로세스의 PID를 가져옵니다.

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.

관련 정보