【问题标题】:<bash> Get PID of all active nginx connections and kill single one<bash> 获取所有活动 nginx 连接的 PID 并杀死单个
【发布时间】:2015-11-20 08:31:16
【问题描述】:

我需要从已建立的 nginx 连接到工作进程终止进程 ID。

有没有办法从所有 nginx 建立的连接中获取 PID?

如果我在 nginx 工作进程上执行netstat,我会从工作进程中获取 pid,在我杀死与其连接的进程后需要保持活动状态。

我试过netstat -anp | grep "client_ip_address" | grep ESTABLISHED

我得到了这个:

tcp   0  0  client_ip:dest_port  client_ip:source_port   ESTABLISHED 15925/nginx: worker

所以 15925 将是当我终止与它的连接时需要保持活动状态的进程 ID。

有办法吗?

【问题讨论】:

    标签: bash nginx pid


    【解决方案1】:

    我认为您可能混淆了进程 ID 和连接。 Nginx 启动一个主进程,然后生成一些工作进程。在一个相当繁忙的系统上,您可能只有(比如说)5 个工作人员。

    当连接进入时,nginx 被唤醒,其中一名工作人员被分配到该连接。从那时起,任何 TCP 流量都会从远程客户端流向该工作进程。每个worker都可以处理大量的连接。大多数 HTTP 连接只持续几秒钟,因此当它们关闭时,它们会为工作线程腾出空间来处理更多新连接。

    所以...如果您尝试使用 shell 命令“kill”,您能做的最好的事情就是终止其中一个工作进程,这将关闭(可能)大量连接。

    如果您的目标是断开一个客户端的连接,同时让所有其他客户端保持连接,那么您就不走运了。没有办法用 shell 命令来做到这一点。如果您的 HTTP 连接挂了很长时间(例如 Websockets),那么您可以在应用程序端编写一些东西来关闭您不喜欢的连接。

    您可能正在考虑的另一件事是关闭来自您不喜欢的地方的连接(一种“垃圾邮件”拦截器)。更常用的方法是直接拒绝连接,以便它使用尽可能少的资源。同样,这是您可以在应用程序端动态执行的操作,或者您可以将 Naxsi (https://github.com/nbs-system/naxsi/wiki) 和 fail2ban (https://github.com/nbs-system/naxsi/wiki/A-fail2ban-profile-for-Naxsi) 之类的东西放在一起。

    【讨论】:

    • 我没有混淆它,我知道它的工作方式,后来我想出了一个办法;如果我的应用程序允许连接到它,它可以生成一些进程 ID,如果我愿意,我可以杀死它......我也想到了 iptables,但是考虑到应用程序本身的工作流程,它会非常混乱而且不太准确...无论如何,我接受你的回答,谢谢...
    【解决方案2】:

    我使用 grep 的 PERL 正则表达式来实现这样的事情。

    $ PID_TO_KILL=`netstat -anp | grep "client_ip_address" | grep ESTABLISHED | grep -Po "(?<=ESTABLISHED).*(?=\/nginx)"`
    $ kill -9 $PID_TO_KILL
    

    【讨论】:

    • 这个命令会杀死 nginx 工作进程,我需要它来维持生命,并杀死当有人连接到该工作进程时创建的进程 ID...我相信这种 pid 是在某处创建的,但我找不到可以找到它的命令...
    • @skymario84 抱歉误读了这个问题,可能pstree 会有帮助吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多