7

Python の子プロセスに問題があるため、非常に単純なスクリプトを作成しました。

import os
import sys
import time

pid = os.fork()
if pid:
    #parent
    time.sleep(30)
else:
    #child
    #os._exit(0)
    sys.exit()

親プロセスがスリープしている間に起動します

ps fax | grep py[t]hon

そして、私はこの出力を読みました

2577 ?        S      0:00 python /home/pi/python/GPIO/GPIODaemon.py restart
2583 ?        Z      0:00  \_ [python] <defunct>

常にゾンビプロセスを使用しているsys.exit()os._exit(0)、常に存在し、その理由を理解できません。

より複雑なコードに取り組んでいると、子プロセスがロックされたままになっているリソースがいくつかあると考えていましたが、この単純化されたコードでは、子はファイル/ソケット/データベース接続をまったく持っていません! 子プロセスがゾンビ化するのはなぜですか?

4

2 に答える 2

0

私はちょうど同様の問題を抱えていました: によって開始されたプロセスはspawnl、特定の時点で終了するか、終了する必要がある可能性があります。すべてのゾンビプロセスを持たないという私の解決策は

def cleanup_subprocesses(self, pid):
  try:
    os.kill(pid, signal.SIGKILL)
  except OSError:
    pass
  os.waitpid(self._pid, 0)

プロセスが時間内に終了しなかった場合、プロセスは強制終了されます。いずれにしても、waitpid コマンドが実行されます。

これは明らかに役に立ちません。プログラムに適切な点がなく、そのプロセスがもう必要ないことがわかっている場合です。

于 2013-11-27T12:35:14.930 に答える