我想我找到了根本原因,它可能是 Python2.7 中的一个错误。在捕获所有可捕获信号并忽略它们之后,我可以跟踪更多错误消息并获得 socket.error 的提示。问题是,这样的错误将首先触发 SIGTERM(trus 尝试终止进程),然后写入 STDERR。我捕获所有 STDOUT 和 STDERR 的机制可以记录消息,因为主进程已被杀死。无论如何,这在守护进程中是一个问题。这些是进程终止前日志中的最后几行
2013-05-07 11:05:53,194 - STDERR - ERROR - Traceback (most recent call last):
2013-05-07 11:05:53,304 - STDERR - ERROR - File "/var/lib/netcam_epd/lib/python2.7/SocketServer.py", line 582, in process_request_thread
2013-05-07 11:05:53,415 - STDERR - ERROR - self.finish_request(request, client_address)
2013-05-07 11:05:53,489 - STDERR - ERROR - File "/var/lib/netcam_epd/lib/python2.7/SocketServer.py", line 323, in finish_request
2013-05-07 11:05:53,587 - STDERR - ERROR - self.RequestHandlerClass(request, client_address, self)
2013-05-07 11:05:53,684 - STDERR - ERROR - File "/var/lib/netcam_epd/lib/python2.7/SocketServer.py", line 640, in __init__
2013-05-07 11:05:53,835 - STDERR - ERROR - self.finish()
2013-05-07 11:05:53,887 - STDERR - ERROR - File "/var/lib/netcam_epd/lib/python2.7/SocketServer.py", line 693, in finish
2013-05-07 11:05:54,084 - STDERR - ERROR - self.wfile.flush()
2013-05-07 11:05:54,182 - STDERR - ERROR - File "/var/lib/netcam_epd/lib/python2.7/socket.py", line 303, in flush
2013-05-07 11:05:54,326 - STDERR - ERROR - self._sock.sendall(view[write_offset:write_offset+buffer_size])
2013-05-07 11:05:54,387 - STDERR - ERROR - error: [Errno 32] Broken pipe
显然,这是由于试图写入不可写的套接字造成的。我认为库应该通过适当的返回值更好地处理这个问题,而不仅仅是抛出错误/异常,因为套接字可以在正常运行中随时关闭。
我将验证这是否真的是根本原因。