【发布时间】:2009-05-14 21:39:20
【问题描述】:
我有一个服务器,它监听套接字连接并根据请求执行不同类型的操作。其中之一是长期存在的数据库查询,服务器为此分叉。
服务器会记录所有活动的子节点,每当被要求关闭时,它会在退出前杀死所有子节点。有几次我遇到服务器崩溃或被不优雅地杀死的情况,这导致子进程成为孤儿。如果我再次尝试让服务器恢复正常,它将拒绝说监听套接字无法绑定,因为该地址/端口已经绑定。
我正在寻找一种方法来改善这种情况,以便主服务器进程可以立即恢复。我已经尝试从孩子那里监视父母的存在并在消失后立即退出,但这只会导致僵尸进程并且套接字似乎仍然被绑定。
服务器是用 Python 编写的,但欢迎任何语言的解释或建议。
【问题讨论】:
-
你知道服务器是如何终止的吗?如果您可以在信号处理程序中发现问题,则可以退出子级。
-
您确定子进程正在检测其父进程的消失并调用退出吗?如果父进程消失,init (pid 1) 应该继承子进程,在退出的子进程上调用 wait() 并且僵尸永远不会发生。
标签: unix sockets process fork zombie-process