1

Pythonでサブプロセスを使用してプログラムを開始しています。開始すると、データベースに作成されたプロセスのpidが保存されます。しばらくしてトリガーが発生した場合は、このプロセスを停止して新しいプロセスを開始する必要があります。問題は、subprocess.Popen().pid を使用すると、停止する必要がある実際のプロセスではなく、ゾンビ プロセス (機能していない) の pid が返されることです。start process コマンドと kill コマンドがあるため、terminate コマンドを使用できません。さまざまなスクリプトで発生します。したがって、ゾンビプロセスのpidではなく、開始しているプロセスの実際のpidを取得する方法が必要です。

4

1 に答える 1

0

ゾンビ プロセスはデッド プロセスであり、そのデータは os によって保持され、呼び出しプロセス (終了値など) に返されます。ゾンビ プロセスは既に死んでいるので、殺すことはできません。それを取り除くには 2 つの方法があります。Popen.wait()親が終了する前に親からのサブプロセスに対して、または親プロセスが実行を継続する必要がある場合はバックグラウンドで使用するかPopen.poll()、またはゾンビの親が1 initになるまですべての親プロセスを強制終了し、init が自動的にそれを取得します。次に、プロセスが終了した DB を更新する必要があります。これは、Linux が新しい無関係なプロセスに同じ pid を与える可能性があるためです (強制終了するつもりのなかったプロセスを強制終了してしまう可能性があります)。

プロセスを停止するだけでよい場合でも、心配する必要はありません。プロセスは既に停止しています。ただし、Linux はプロセスごとに pid を発行し、ゾンビが多すぎると new を実行できなくなる可能性があるため、システム内にゾンビが多すぎることを心配する必要があります (1 つでも多すぎると言う人もいます)。プロセス。

親プロセスに強制的に子プロセスを取得させるハックがありますhere

于 2013-10-18T16:58:48.663 に答える