
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
。