通常はここに投稿しないでください。
起動時にフォークする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スクリプトがプロセスから開始したかどうかは関係ありません。可能であれば、親プロセス。
それがどのように機能するかについてのより良い説明:
-
systemd
Server.py
を生成します -
Server.py
systemd
のpidファイルをフォークして書き込みます -
Server.py
次に、その指示に基づいてgnuscreenでサーバープロセスを生成します -
Server.py
サーバーから要求された再起動を実行するために実行を継続します
なしで起動する場合 systemd
、Server.py
再起動でき、GNUscreen
起動は影響を受けません。 systemd
で起動する場合 、Server.py
の場合 これらの画面プロセスがpid1に孤立する代わりに、シャットダウンします。
承認された回答:
KillMode
を設定するだけでこれを修正できました process
control-group
の代わりに (デフォルト)。ありがとうございました!