【问题标题】:Linux on reboot process with PPID 1 do not clean up resources (socket)使用 PPID 1 重启的 Linux 不清理资源(套接字)
【发布时间】:2014-11-25 13:25:45
【问题描述】:

在系统重新启动 linux 时,我的 ppid 1 网络应用程序恶魔不会断开套接字连接。 但是,如果手动使用 kill -9 杀死该恶魔,它会断开连接。

如果我使用 nohup 运行应用程序,我也会注意到相同的行为。重新启动时它不会断开连接,而在不使用 nohup 时它会断开连接。

请提供指针如何为恶魔处理适当的清理资源。

【问题讨论】:

  • 您是否有一些脚本或任何在您重新启动时向这些进程发出信号的东西?为什么您希望这些进程以其他方式终止连接?
  • 信号 9 无法被捕获。接收到该信号的进程将立即被内核终止,而不会调用任何关闭挂钩。如果这实际上是您想要的行为,那么您声称在系统重新启动时不会发生这种情况(并且您没有提供更干净的关机)根本不可信。
  • 当我的进程终止时,应该在 tcp 层 FIN FIN-ACK 中进行适当的握手,以便正确关闭 tcp。这没有发生,因此另一端 netstat 显示连接已建立,尽管系统已重新启动。 linux 使用 PPID 1 终止进程的方式似乎有些不同。
  • @JohnBollinger。我没有执行程序来正确关闭打开的套接字。但是我看到正常应用程序的正确关闭,其父级在重新启动时是 bash shell。但是,如果我使用 nohup 或在启动期间运行相同的应用程序,则 PPID 将为 1。在这种情况下,操作系统不会自动清理套接字。

标签: c linux sockets process network-programming


【解决方案1】:

如果您的服务器进程收到KILL 信号(即信号 9),您不能假设任何清理工作。但是,服务通常会提供一些触发干净关闭的方法。这可以是 TERM 信号(信号 15)的适当处理程序的形式,在任何情况下都希望拥有它。

此外,明智的做法是将您的服务设置为通过系统的服务管理子系统进行管理,无论是 SystemV 风格的初始化脚本、systemd 还是其他任何替代方案。这样一来,您可以更好地控制系统在系统重新启动或关闭期间关闭服务的方式和时间以及何时,而且在需要时可以更轻松地手动管理服务。

【讨论】:

    【解决方案2】:

    这是一个有趣的问题。

    TCP 主动关闭需要发送FIN 并等待FIN/ACK。显然,当系统被要求重新启动时,它不应该等待FIN/ACK。它仍然可以发送 FIN 或 RST。

    但是,您的其他应用程序不能期望对等方在连接失败时发送FIN 或RST。例如,如果您从机器上拔下以太网电缆,并且您的应用程序没有发送任何数据,则永远不会通知对等方已断开连接。相反,您的应用程序应该发送保持活动消息以检测断开的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-23
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多