【问题标题】:Linux: How to kill programs that use port 1935?Linux:如何杀死使用端口 1935 的程序?
【发布时间】:2011-04-26 07:48:24
【问题描述】:

我有一个red5 server (JAVA) 在我的 Linux 服务器上运行。

有时,服务器会关闭。当我尝试重新启动它时出现错误:

“绑定错误,此端口已被占用”。

所以我尝试用 killall -9 java 杀死服务器 并尝试重新启动服务器:同样的错误。

我必须等待一段时间(大约 2-3 分钟)然后重新启动它:这行得通。

我只需要知道为什么当我终止进程时,我仍然需要等待 2-3 分钟,然后端口 1935 才空闲,我可以再次运行服务器。

有没有办法立即终止这个进程并释放端口?

【问题讨论】:

  • 我不相信将 SIGKILL 归咎于端口清理失败的答案。操作系统完全知道进程已经消失,并以标准方式放弃其资源。刚刚关闭的 TCP 侦听端口的标准方法是在一段时间内不可用,以防止连接到错误的服务器。正如贾斯汀的回答中提到的那样,使用 SO_REUSEADDR 可以最容易地避免这种情况。

标签: java linux port red5 kill-process


【解决方案1】:

如果您确定服务器的旧实例拥有该端口,只需运行 jps,在列表中找到您的服务器 pid 并运行 kill -9 my_pid

对于通用的非 java 进程,lsof -i :1935 通常对我有用。再次,获取 pid 并终止此进程。

【讨论】:

    【解决方案2】:

    如果可能,您应该在程序设置其套接字时使用套接字SO_REUSEADDR 选项。这样,当程序重新启动时,您可以立即重用套接字,而不必等待 2-3 分钟。

    有关更多信息,请参阅 javadoc setReuseAddress。特别是:

    当 TCP 连接关闭时,连接可能会在连接关闭后的一段时间内保持超时状态(通常称为 TIME_WAIT 状态或 2MSL 等待状态)。对于使用众所周知的套接字地址或端口的应用程序,如果存在涉及套接字地址或端口的处于超时状态的连接,则可能无法将套接字绑定到所需的 SocketAddress。

    在使用 bind(SocketAddress) 绑定套接字之前启用 SO_REUSEADDR 允许绑定套接字,即使先前的连接处于超时状态。

    【讨论】:

    【解决方案3】:

    问题是杀戮中的-9

    如果您使用 SIGKILL (-9) 终止进程,该进程将立即终止。因此,该端口一直分配到(一分钟后)操作系统。注意到问题。在 SIGKILL 之前尝试 SIGHUP 和 SIGINT(按顺序)。

    无论如何,使用netstat -a -t -p 来验证哪个进程获得了端口。

    【讨论】:

      【解决方案4】:

      默认情况下不应该使用kill -9。该过程无法清理内部事物。 使用例如端口 8000 杀死应用程序的 pid :

      kill $(netstat -nptl | awk '/:8000/{gsub("/.*", ""); print $7}')
      

      【讨论】:

      • kill:用法:kill [-s sigspec | -n 符号 | -sigspec] pid | jobspec ... 或 kill -l [sigspec]
      • 这个命令似乎有错误:kill:usage:kill [-s sigspec | -n 符号 | -sigspec] pid | jobspec ... 或 kill -l [sigspec]
      【解决方案5】:

      这是一个方便的oneliner:

      kill $(fuser 1935/tcp)
      

      【讨论】:

        【解决方案6】:

        立即处理终止和端口释放:

         fuser -k 1935/tcp
        

        【讨论】:

          猜你喜欢
          • 2020-06-08
          • 1970-01-01
          • 2012-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-07
          相关资源
          最近更新 更多