web-dev-qa-db-ja.com

進行中のPIDを取得Pythonスクリプトはsystemd経由で開始されます

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を維持できますか?

2
charliesneath

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を使用する必要があることに注意してください。

0
charliesneath

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
EchoMike444