【问题标题】:Determine the process pid listening on a certain port确定监听某个端口的进程pid
【发布时间】:2012-04-09 00:56:57
【问题描述】:

正如标题所说,我正在运行多个游戏服务器,每个服务器都有相同的name,但PIDport 编号不同。我想匹配正在侦听某个端口的服务器的PID,然后我想终止这个进程。我需要它来完成我的 bash 脚本。

这可能吗?因为它还没有在网上找到任何解决方案。

【问题讨论】:

    标签: unix port freebsd pid


    【解决方案1】:

    netstat-p 标志为您提供进程的 PID:

    netstat -l -p
    

    *如果显示 - 而不是 PID,则使用 sudo

    编辑: 在 FreeBSD 中获取套接字用户的 PID 所需的命令是 sockstat。 正如我们在与@Cyclone 的讨论中得出的结论,完成这项工作的线路是:

    sockstat -4 -l | grep :80 | awk '{print $3}' | head -1
    

    【讨论】:

    • netstat: 80: unknown or uninstrumented protocol 使用80 (nginx) 端口进行测试。没用。
    • 改用netstat -nlp | grep :80
    • netstat: option requires an argument -- p
    • @jasonbrittain 在 Cygwin 上,Windows 原生 netstat 被调用。它有其他语法。
    • 这个答案是错误的:netstat: option requires an argument -- p
    【解决方案2】:

    语法:

    kill -9 $(lsof -t -i:portnumber)

    例子: 要杀死在端口 4200 上运行的进程,请运行以下命令

    kill -9 $(lsof -t -i:4200)
    

    在 Ubuntu 中测试。

    【讨论】:

      【解决方案3】:

      在 Windows 上,获取 pid 的 netstat 选项是 -o 并且 -p 选择协议过滤器,例如: netstat -a -p tcp -o

      【讨论】:

        【解决方案4】:

        netstat -p -l | grep $PORTlsof -i :$PORT 解决方案很好,但我更喜欢 fuser $PORT/tcp 扩展语法而不是 POSIX(适用于 coreutils),就像管道一样:

        pid=`fuser $PORT/tcp`
        

        它打印纯 pid,因此您可以删除 sed 魔法。

        fuser 成为我的爱人工具的一件事是能够直接向该进程发送信号(这种语法也是对 POSIX 的扩展):

        $ fuser -k $port/tcp       # with SIGKILL
        $ fuser -k -15 $port/tcp   # with SIGTERM
        $ fuser -k -TERM $port/tcp # with SIGTERM
        

        FreeBSD 也支持 -k:http://www.freebsd.org/cgi/man.cgi?query=fuser

        【讨论】:

        • 让我们更加简洁明了
        【解决方案5】:

        我想以编程方式——仅使用 Bash——终止侦听给定端口的进程。

        假设端口是 8089,那么我是这样做的:

        badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
        kill -9 $badPid
        

        我希望这对其他人有帮助!我知道它会帮助我的团队。

        【讨论】:

        • 这是我用来执行此操作的函数:function kill-listener { lsof -i:$1 -t | xargs kill -9 } 使用您的端口 8089 示例:kill-listener 8089
        【解决方案6】:

        由于 sockstat 没有本地安装在我的机器上,我修改了 stanwise 的答案以使用 netstat 代替..

        netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print $7}' | sed -e "s/\/.*//g""
        

        【讨论】:

          【解决方案7】:

          可以传递给 kill 命令的短版本:

          lsof -i:80 -t
          

          【讨论】:

          • 这还包括在该端口上连接的进程。 lsof -i4TCP:80 -sTCP:LISTEN -t 可能是您想要的。
          • 正是我想要的。我想通过搜索它正在运行的端口来终止一个进程。
          • @Nevir “还包括连接在该端口上的进程”是什么意思?你能解释一下吗?
          • kill -9 `lsof -i:80 -t` 方便复制
          【解决方案8】:

          netstat -nlp 应该告诉你监听哪个端口的 PID。

          【讨论】:

          • netstat: 80: unknown or uninstrumented protocol 使用80 (nginx) 端口进行测试。没用。
          猜你喜欢
          • 2010-09-10
          • 2011-09-17
          • 1970-01-01
          • 2013-06-17
          • 2013-05-14
          • 2012-06-15
          • 1970-01-01
          • 2011-02-28
          • 1970-01-01
          相关资源
          最近更新 更多