Pythonデーモンプロセス内でマルチプロセッシングモジュールを使用すると(python-daemonを使用)、次のエラーが発生します。
トレースバック(最後の最後の呼び出し): _run_exitfuncsのファイル"/usr/local/lib/python2.6/atexit.py"、24行目 func(* targs、** kargs) _exit_functionのファイル"/usr/local/lib/python2.6/multiprocessing/util.py"、行262 active_children()のpの場合: active_childrenのファイル"/usr/local/lib/python2.6/multiprocessing/process.py"、43行目 _掃除() _cleanupのファイル"/usr/local/lib/python2.6/multiprocessing/process.py"、53行目 p._popen.poll()がNoneでない場合: ファイル"/usr/local/lib/python2.6/multiprocessing/forking.py"、行106、ポーリング pid、sts = os.waitpid(self.pid、flag) OSError:[Errno10]子プロセスがありません
デーモンプロセス(親)は、多数のプロセス(子)を生成し、定期的にプロセスをポーリングして、プロセスが完了したかどうかを確認します。親は、プロセスの1つが完了したことを検出すると、そのプロセスを再開しようとします。この時点で、上記の例外が発生します。プロセスの1つが完了すると、マルチプロセッシングモジュールを含むすべての操作でこの例外が生成されるようです。デーモン以外のPythonスクリプトで同じコードを実行すると、エラーなしで実行されます。
編集:
サンプルスクリプト
from daemon import runner
class DaemonApp(object):
def __init__(self, pidfile_path, run):
self.pidfile_path = pidfile_path
self.run = run
self.stdin_path = '/dev/null'
self.stdout_path = '/dev/tty'
self.stderr_path = '/dev/tty'
def run():
import multiprocessing as processing
import time
import os
import sys
import signal
def func():
print 'pid: ', os.getpid()
for i in range(5):
print i
time.sleep(1)
process = processing.Process(target=func)
process.start()
while True:
print 'checking process'
if not process.is_alive():
print 'process dead'
process = processing.Process(target=func)
process.start()
time.sleep(1)
# uncomment to run as daemon
app = DaemonApp('/root/bugtest.pid', run)
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()
#uncomment to run as regular script
#run()