通常はここに投稿しないでください。
起動時にフォークするPythonスクリプトがあり、他の多くのプロセスを開始する責任があります。このスクリプトは、起動時にsysvinitを介して起動されていました。 、しかし最近、Debian Jessieにアップグレードしたので、systemd経由で起動するように調整しました。 。
残念ながら、解決できない問題が発生しています。スクリプトをユーザーシェルで直接起動すると、子プロセスが正しく起動され、スクリプトが終了すると、子プロセスが孤立して実行を継続します。
systemdを介して起動したときに、親プロセスが終了すると、子もすべて終了します(screen sはダイで起動し、デッドとして表示されます。
理想的には、すべての子プロセスを強制終了せずに親スクリプトを再起動できる必要がありますが、不足しているものはありますか?
ありがとう!
[Unit]
Description=Server commander
After=network.target
[Service]
User=serveruser
Type=forking
PIDFile=/var/Server/Server.pid
ExecStart=/var/Server/Server.py
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
編集:
Pythonスクリプトは本質的に、その子プロセスの「コントローラー」であることを指摘するのはおそらく私にとって適切です。 GNUscreenでサーバーを起動および停止します ■中央サーバーからの要求に応じて。通常は常に実行されており、サービスを生成して終了することはありません。
ただし、子プロセスを強制終了せずにスクリプトをリロードできるようにしたい場合があります。これは、プロセスがpid 1に孤立していることを意味します。実際、Pythonスクリプトがプロセスから開始したかどうかは関係ありません。可能であれば、親プロセス。
それがどのように機能するかについてのより良い説明:
-
systemdServer.pyを生成します -
Server.pysystemdのpidファイルをフォークして書き込みます -
Server.py次に、その指示に基づいてgnuscreenでサーバープロセスを生成します -
Server.pyサーバーから要求された再起動を実行するために実行を継続します
なしで起動する場合 systemd 、Server.py 再起動でき、GNUscreen 起動は影響を受けません。 systemdで起動する場合 、Server.pyの場合 これらの画面プロセスがpid1に孤立する代わりに、シャットダウンします。
承認された回答:
KillModeを設定するだけでこれを修正できました process control-groupの代わりに (デフォルト)。ありがとうございました!