<bash>获取所有活动nginx连接的PID并终止单个连接

时间:2015-11-20 08:31:17

标签: bash nginx pid

我需要将已建立的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。

有办法吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我想也许你会混淆进程ID和连接。 Nginx启动一个主进程,然后生成一些工作进程。在一个相当繁忙的系统中,你可能只有(比方说)5名工人。

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

所以......如果你试图使用shell命令'kill',那么你所能做的最好的事情就是终止一个工作进程,这会关闭(可能)大量的连接。 / p>

如果您的目标是断开一个客户端,同时让所有其他客户端保持联系,那么您将失去运气。使用shell命令无法做到这一点。如果您的HTTP连接闲置很长时间(例如Websockets),那么您可以在应用程序端编写一些内容,以便关闭您不喜欢的连接。

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