5

クライアントハンドラーごとに新しいスレッドを実行するリスナーサーバーがあります。各ハンドラーは以下を使用できます。

proc = subprocess.Popen(argv, executable = "./Main.py", stdout = _stdout, stderr = subprocess.STDOUT, close_fds=False)

ハンドラスレッドが終了した後、バックグラウンドで新しいプロセスを実行します。

バックグラウンドプロセスが終了した後、Z状態に保たれます。このゾンビを回避するために、subprocess.Popen()にSIG_CHILDを処理するように依頼することは可能ですか?

proc.wait()を使用してプロセスの状態を読み取りたくないのは、実行中のすべてのバックグラウンドプロセスのリストを保存する必要があるためです...

UPD

ゾンビを避けてバックグラウンドでいくつかのプロセスを実行し、.communicate()を使用していくつかのプロセスを実行して、これらのプロセスからデータを読み取る必要があります。その場合、koblasからのシグナルトリックを使用すると、エラーが発生します。

File "./PyZWServer.py", line 115, in IsRunning
  return (subprocess.Popen(["pgrep", "-c", "-x", name], stdout=subprocess.PIPE).communicate()[0] == "0")
File "/usr/lib/python2.6/subprocess.py", line 698, in communicate
  self.wait()
File "/usr/lib/python2.6/subprocess.py", line 1170, in wait
  pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
File "/usr/lib/python2.6/subprocess.py", line 465, in _eintr_retry_call
   return func(*args)
OSError: [Errno 10] No child processes
Error happened during handling of client
4

1 に答える 1

5

SIGCHLDのシグナルハンドラーを追加すると、カーネルに待機/刈り取り部分を処理させることができます。

具体的には次の行です。

signal.signal(signal.SIGCHLD, signal.SIG_IGN)

あなたのゾンビの世話をします。

于 2011-06-22T15:39:06.937 に答える