GNU/Linux >> Linux の 問題 >  >> Linux

Systemdおよびプロセスの生成:メインプロセスが終了すると、子プロセスが強制終了されますか?

通常はここに投稿しないでください。
起動時にフォークする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 サーバーから要求された再起動を実行するために実行を継続します

なしで起動する場合 systemdServer.py 再起動でき、GNUscreen 起動は影響を受けません。 systemdで起動する場合 、Server.pyの場合 これらの画面プロセスがpid1に孤立する代わりに、シャットダウンします。

承認された回答:

KillModeを設定するだけでこれを修正できました process control-groupの代わりに (デフォルト)。ありがとうございました!

関連:Linux –現在のプロセスのネットワークを共有解除する方法は?
Linux
  1. CentOS/RHEL 7 および 8 で systemd ブート プロセスをデバッグする方法

  2. 親が終了した後に子プロセスを終了させる方法は?

  3. すべての子プロセスを見つける方法は?

  1. メインプロセスがsystemdから開始されたときに子プロセスをデタッチできません

  2. メール サーバーにメールが届いたときにスクリプトを実行する方法は? (デビアン)

  3. Linux カーネル スレッドは本当にカーネル プロセスですか?

  1. ゾンビプロセスとは何ですか?ゾンビプロセスを見つけて殺す方法は?

  2. Ddはいつデータのコピーに適していますか? (または、Read()とWrite()が部分的である場合)?

  3. 子プロセスのPgidが親のPidではないのはなぜですか?