systemd
を使用して、起動時にシェルスクリプトstart.sh
を実行しています。これにより、プログラムのメインのPythonスクリプトであるmain.py
が最終的に開始されます。
main.py
の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を維持できますか?
os.getpid()
に関するFubarのコメントに基づいて、親スレッドが強制終了するプロセスであることが判明したため、os.getppid()
が私が必要とするものを達成したことがわかりました。
PID = str(os.getppid())
with open(‘app.pid’, ‘w’) as file:
file.write(PID)
その後、次のスクリプトを使用して、これを後で強制終了できます。
Sudo kill `cat /tmp/app.pid`
オリジナルのpythonスクリプトはSudo
で実行されるため、ここではSudo
を使用する必要があることに注意してください。
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)"