unix - 使用 fork 和 sockets 时处理不正常的关闭

标签 unix sockets process fork zombie-process

我有一个服务器,它监听套接字连接并根据请求执行不同类型的操作。其中之一是长期存在的数据库查询,服务器为此 fork 。

服务器会记录所有活跃的 child ,每当被要求关闭时,它会在退出前杀死所有的 child 。有几次我遇到过服务器崩溃或被非正常杀死导致子进程成为孤儿的情况。如果我再次尝试恢复服务器,它会拒绝说监听套接字无法绑定(bind),因为该地址/端口已经绑定(bind)。

我正在寻找一种方法来改善这种情况,以便主服务器进程可以立即恢复。我已经尝试从 child 那里监视父存在并在消失后立即退出,但这只会导致出现僵尸进程并且套接字似乎仍被绑定(bind)。

服务器是用 Python 编写的,但欢迎任何语言的解释或建议。

最佳答案

让您的服务器成为 process group 的领导者.在这种情况下, children 会在组长退出时被终止。

Where a textual user interface is being used on a Unix-like system, sessions are used to implement login sessions. A single process, the session leader, interacts with the controlling terminal in order to ensure that all programs are terminated when a user "hangs up" the terminal connection. (Where a session leader is absent, the processes in the terminal's foreground process group are expected to handle hangups.)

关于unix - 使用 fork 和 sockets 时处理不正常的关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/865955/

相关文章:

python - 在 python 中打开具有特定 pid 的进程

java - Java 中的进程与线程

linux - Unix 脚本文件重定向

java - 如何从java代码执行以下命令行表达式?

unix - 如何解决/var/www复制/写入权限被拒绝的问题?

java - 为什么客户端看不到服务器发送的第一条消息?

c# - 重新连接 socket

c - 如何恢复被 dup2 覆盖的标准输入?

node.js - 水平扩展的 WebSocket 服务器上的负载平衡套接字?

Java 运行时进程不会 "Grep"