私はこの問題のための質問を開き、問題を解決するのに十分な答えを得られませんでした(私の問題を説明する厳しさが欠けている可能性が高い):Zombie process in python multiprocessing daemonデーモンプロセス内のPythonマルチプロセッシングプール
Popen
を使用してコマンドを実行するためにワーカーのプールを使用するPythonデーモンを実装しようとしています。私はhttp://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
から基本的なデーモンを借りてきた私はinit
、daemonize
(または均等start
)とstop
方法を変更しました。私はprint文を使用してコードをデバッグできるように、私は標準入力、stdoutとstderrを設定しておりません
def __init__(self, pidfile):
#, stdin='/dev/null', stdout='STDOUT', stderr='STDOUT'):
#self.stdin = stdin
#self.stdout = stdout
#self.stderr = stderr
self.pidfile = pidfile
self.pool = Pool(processes=4)
:ここinit
方法への変更があります。また、私はいくつかの場所にこのプールを移動しようとしましたが、これは例外を生成しない唯一の場所です。ここで
daemonize
方法に変更されています。私はデバッグできるよう
def daemonize(self):
...
# redirect standard file descriptors
#sys.stdout.flush()
#sys.stderr.flush()
#si = open(self.stdin, 'r')
#so = open(self.stdout, 'a+')
#se = open(self.stderr, 'a+', 0)
#os.dup2(si.fileno(), sys.stdin.fileno())
#os.dup2(so.fileno(), sys.stdout.fileno())
#os.dup2(se.fileno(), sys.stderr.fileno())
print self.pool
...
同じことが、私はIOをリダイレクトしていません。ここのプリントは、私がプールの場所を確認できるように使用されています。
そしてstop
方法の変更:
def stop(self):
...
# Try killing the daemon process
try:
print self.pool
print "closing pool"
self.pool.close()
print "joining pool"
self.pool.join()
print "set pool to None"
self.pool = None
while 1:
print "kill process"
os.kill(pid, SIGTERM)
...
ここ
アイデアは、私が唯一のプロセスを殺すだけでなく、プールをクリーンアップする必要はないということです。 self.pool = None
は、動作しなかった問題を解決するための単なるランダムな試みです。最初は、これは、self.pool.close()
とself.pool.join()
がwhileループの内側にあるos.kill(pid, SIGTERM)
のときに発生していたゾンビの子供の問題だと思っていました。これは、プールの場所をprint self.pool
で調べることを決定する前です。これを実行した後、デーモンの起動時と停止時にプールが同じではないと私は考えます。ここではいくつかの出力は次のとおりです。
[email protected]:~/pyCode/jobQueue$ sudo ./jobQueue.py start
<multiprocessing.pool.Pool object at 0x1c543d0>
[email protected]:~/pyCode/jobQueue$ sudo ./jobQueue.py stop
<multiprocessing.pool.Pool object at 0x1fb7450>
closing pool
joining pool
set pool to None
kill process
kill process
... [ stuck in infinite loop]
オブジェクトの異なる場所は、彼らが同じプールではなく、それらの1つは、おそらくゾンビであることを私に示唆しますか?
はCTRL+C
した後、ここで私はps aux|grep jobQueue
から得るものです:私は別の場所の数にself.pool = Pool(processes=4)
を移動しようとしている
root 21161 0.0 0.0 50384 5220 ? Ss 22:59 0:00 /usr/bin/python ./jobQueue.py start
root 21162 0.0 0.0 0 0 ? Z 22:59 0:00 [jobQueue.py] <defunct>
me 21320 0.0 0.0 7624 940 pts/0 S+ 23:00 0:00 grep --color=auto jobQueue
。 start()' or
に移動した場合、daemonize()methods,
が表示されます。print self.pool`はNoneTypeであるという例外をスローします。また、場所はポップアップするゾンビプロセスの数を変更するようだ。
現在、私はワーカーを介して何かを実行する機能を追加していません。私の問題は、労働者のプールを正しく設定することと完全に関連しているようです。この問題を解決するためのあらゆる情報や、Popen
を使用して一連のコマンドを実行するためのワーカーのプールを使用するデーモンサービスの作成についてのアドバイスに感謝します。私はそれほど遠からず、私は先に直面している挑戦を知らない。私はちょうど私自身のプールを書く必要があるかもしれないと思っていますが、ここでプールを働かせる素晴らしいトリックがあれば、それは素晴らしいでしょう。
私は何をする必要があるのか分かっていると思いますが、どうやってやるのか分かりません。デーモンの内部では、pidファイルに書き込みます。 startまたはstopが呼び出されるたびに、デーモンのPIDがファイルから取得されます。私はプールプロセスのPIDで同じことをする必要がありますが、どのように? –