【问题标题】:Find (and kill) process locking port 3000 on Mac [closed]在 Mac 上查找(并杀死)进程锁定端口 3000 [关闭]
【发布时间】:2011-04-20 18:52:36
【问题描述】:

如何找到(并终止)侦听/使用我的 TCP 端口的进程?我在 macOS 上。

有时,在发生崩溃或一些错误后,我的 Rails 应用程序会锁定端口 3000。我使用 ps -ef 找不到它...

运行时

rails server

我明白了

Address already in use - bind(2) (Errno::EADDRINUSE)

【问题讨论】:

  • 可以在下面的@Kevin Suttle 的回答中找到杀死任何用户指定端口上的进程的非常简洁的解决方案。转载于此供后人参考:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
  • @user456584 上面的评论应该是公认的答案 ^^^ 该函数可以杀死我在端口上运行的 许多 进程
  • 在使用 netstat 找到进程并使用 kill -9 命令杀死进程后工作!
  • @richardec kill -9 $(lsof -ti:3000) 不工作?

标签: macos process


【解决方案1】:
  1. 你可以试试netstat

     netstat -vanp tcp | grep 3000
    
  2. 对于 ma​​cOS El Capitan 和更新版本(或者如果您的 netstat 不支持 -p),请使用 lsof

     lsof -i tcp:3000 
    
  3. 对于 Centos 7 使用:

     netstat -vanp --tcp | grep 3000
    

【讨论】:

  • 谢谢!您的回答催生了我的“death_to 'port'”脚本。 (#!/usr/bin/ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
  • lsof 的“简洁”标志产生适合管道到后续杀死的输出:lsof -t -i tcp:1234 | xargs kill
  • 我已经把它放到了我的~/.bash_profile:findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkill 所以现在我只需要输入killport 8080 就可以节省一些时间
  • 另一个技巧是将-P 添加到lsof 命令中,以便原始端口在输出中可见:lsof -P -i:3000
  • 这篇文章只是答案的一半
【解决方案2】:

查找:

sudo lsof -i :3000

杀死:

kill -9 <PID>

【讨论】:

  • 有时 lsof -i :port 不会显示任何内容。试试 sudo lsof -i :port.
  • 为了安全起见,建议先尝试kill -15 &lt;PID&gt;,然后再使用-9
  • @MichaelTrouw 差不多一年后,但这是你的答案。 :-) unix.stackexchange.com/a/8918 TL;DR kill -15 让进程有机会自行清理。
  • 我认为这个答案应该说明-9 做了什么。
  • 请不要只使用kill -9 而不三思而后行,先尝试其他信号。它会导致进程立即退出,而不会自行清理,可能会留下一团糟或使数据库处于不一致的状态...尝试使用 TERM(kill 的默认值,不需要标志)或 QUIT(kill -3 pid)至少首先,在发送 KILL 之前检查您正在处理的进程。
【解决方案3】:

快速简单的解决方案

kill -9 $(lsof -ti:3000)

对于多个端口:

kill -9 $(lsof -ti:3000,3001)

#3000是要释放的端口

用单行命令杀死多个端口:

kill -9 $(lsof -ti:3000,3001)

#这里3000和3001多个端口是要释放的端口

lsof -ti:3000

如果 prot 被占用,上面的命令将返回如下内容:82500 (Process ID)

lsof -ti:3001

82499

lsof -ti:3001,3000

82499 82500

杀死 -9 $(lsof -ti:3001,3000)

在单个命令中终止 82499 和 82500 进程。

package.json 脚本中使用它:

"scripts": {
   "start": "kill -9 $(lsof -ti:3000,3001) && npm start"
}

在终端中你可以使用:

npm run start

【讨论】:

  • 很高兴它有帮助。
  • 这真的很简单,而且确实有效。非常感谢。
  • 这应该是最好的解决方案。是否都在一个简短的命令中找到并杀死:)
  • 当端口空闲时,我得到“kill: not enough arguments”。是否可以将其设置为在被占用和空闲时都可以工作?
  • 试试:$(lsof -ti:3000) &amp;&amp; kill -9 $(lsof -ti:3000)
【解决方案4】:

上面没有对我有用。任何有我经验的人都可以尝试以下方法(对我有用):

运行:

lsof -i :3000 (where 3000 is your current port in use)

然后检查报告的 PID 的状态:

ps ax | grep <PID>

最后,“开始吧”:

kill -QUIT <PID>

【讨论】:

  • 这实际上似乎比 Filip Spiridonov 稍后给出的答案更好,后者有 277 票反对您的 9。您的答案是 6 个月前,并且具有相同的信息和更多的解释。没有正义……
  • kill -QUIT 之前尝试kill -TERM(或只是kill)。并非每个进程都会在 SIGQUIT 上有序关闭。
【解决方案5】:

使用端口 3000 提取进程的 PID 并杀死它。

lsof -ti:3000 | xargs kill

-t 标志会从 lsof 输出中删除除 PID 之外的所有内容,从而很容易将其杀死。

【讨论】:

  • 你可以过滤掉“监听”端口:lsof -ti:3000 -sTCP:LISTEN
  • 这种方法最适合我。一个简单的班轮,清除繁忙的港口。谢谢!
【解决方案6】:

这个单一的命令行很容易记住:

npx kill-port 3000

你也可以一次杀死多个端口:

npx kill-port 3000 3001 3002

对于更强大的搜索工具:

npx fkill-cli


PS:他们使用第三方 javascript 包。 npx 内置在 Node.js 中。

来源:tweet | github

【讨论】:

  • 您能分享使用 brew 安装 npx 的详细信息吗?我尝试在我的 Mac High Sierra 10.13.3 上安装它,但它不起作用。
  • @realPK npx 附带npm 附带node.js,所以它不是一个单独的包。只需升级你的 node.js 和你的 npm 版本。
  • 我主要做Java,还没有接触过Node。我发现了另一种杀死端口上运行的服务的方法。 TY 回复。
  • 需要 NodeJS 和 JavaScript 来杀死在端口 3000 上运行的东西可能是 rails... 对我来说似乎开销太大。在您的 .bashrc 或 .zshrc 中添加一个简单的行并使用别名将解决它,而无需互联网。别名 kill3000='lsof -ti:3000 | xargs kill' 那么你可以这样做:kill3000
【解决方案7】:

您可以使用lsof -i:3000

即“列出打开的文件”。这会为您提供进程列表以及它们使用的文件和端口。

【讨论】:

    【解决方案8】:

    要强行杀死这样的进程,请使用以下命令

    lsof -n -i4TCP:3000  
    
    OR lsof -i:3000
    

    其中 3000 是进程正在运行的端口号

    这将返回进程 id(PID) 并运行

    kill -9 "PID"
    

    将 PID 替换为运行第一个命令后得到的数字

    为什么kill -9 PID 不起作用? 如果你试图用它的 PID 杀死一个进程并且它仍然在另一个 PID 上运行,看起来你已经在另一个帐户中启动了该进程,很可能是 root 帐户。所以用sudo su登录并杀死它

    【讨论】:

    • 我尝试在 ZSH 中创建别名: alias port="lsof -n -i4TCP:$1" 并得到以下错误...如何实现? $ port 8080 lsof: 不可接受的端口规格在:-i 4TCP:
    【解决方案9】:

    在您的.bash_profile 中,为terminate 3000 进程创建快捷方式:

    terminate(){
      lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 
    }
    

    然后,如果被阻止,请致电$terminate

    【讨论】:

    • 你可以让这个对任何端口都足够灵活:github.com/kevinSuttle/dotfiles/commit/…
    • 还有这样一个描述性的名字=p
    • 我有类似的东西,但我通过了端口。我将我的函数 KP 命名为 kill port。
    【解决方案10】:

    杀死多个端口。

    $ npx kill-port 3000 8080 8081
    
    Process on port 3000 killed
    Process on port 8080 killed
    Process on port 8081 killed
    

    希望对您有所帮助!

    【讨论】:

    • 使用npx 查找正在运行的端口怎么样?
    • Npx 似乎支持检测端口,例如“npx 检测端口 8080”。但似乎不支持查找所有正在运行的端口。
    【解决方案11】:
    lsof -P | grep ':3000' | awk '{print $2}'
    

    这将为您提供在 MacOS 上测试过的 pid。

    【讨论】:

    • 在 MAC 上杀死端口 3000 上的所有 pid:lsof -P | grep ':3000' | awk '{打印 $2}' | xargs 杀死 -9
    • 可以有多个进程监听同一个端口吗?
    • 我们的 Rails 应用程序产生子进程的工作人员,我必须用它来杀死孤立的工作人员
    • 这也会杀死连接到端口的网络浏览器
    • 这是一个工作:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
    【解决方案12】:

    在 OS-X El Captain 的命令行中执行:

    kill -kill `lsof -t -i tcp:3000`
    

    lsof 的简洁选项只返回 PID。

    【讨论】:

      【解决方案13】:

      杀死端口上的进程的方法之一是使用 python 库:freeport (https://pypi.python.org/pypi/freeport/0.1.9)。安装后,只需:

      # install freeport
      pip install freeport
      
      # Once freeport is installed, use it as follows
      $ freeport 3000
      Port 3000 is free. Process 16130 killed successfully
      

      【讨论】:

      • 到目前为止,这不是最简单的方法。赞成的回复不需要您下载和安装任何东西。
      • 当满足先决条件时,这就是如此简单易记。我们对“最简单”有不同的定义,这个答案是完全有效和恰当的。也许只是缺少使用 pip 安装 freeport 的说明。
      • 在底层,freeport 只是一个调用 lsof -t -i:3000.. 的包装器。
      • 这个解决方案不是最简单的,但它 100% 符合 OP 的要求......所以它确实是有效的 AF
      【解决方案14】:

      查看阻塞端口的进程:

      netstat -vanp tcp | grep 3000

      杀死阻塞端口的进程:

      kill $(lsof -t -i :3000)

      【讨论】:

      • 这在 Mac 机器上不起作用,返回以下内容:kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] 但是,它可以在大多数 linux 发行版中工作
      • @MilanVelebit 实际上它在我的 Mac 机器 (Sierra) 上运行良好。如果您的端口3000 被占用,它工作正常。但是,如果没有进程阻塞端口,那么您将收到 kill: not enough arguments 错误。
      • 这很奇怪,我有两台 Mac(都是 High Sierra tho),我记得对它们都运行过这些命令(旧习惯),而且我确定它们不会运行。我刚刚在我的机器上再次尝试,知道端口被占用,同样的错误。 ://
      • 您在运行 netstat -vanp tcp | grep 3000 时是否获得了有效的 PID,用于您的端口被占用?
      • 我在bashzsh shell 中都试过了。对我来说很好。不知道为什么它不适合你。可能与High Sierra有关?我不知道:/
      【解决方案15】:

      寻找并杀死:

      这个单一的命令行很简单并且可以正常工作。

      kill -9 $(lsof -ti tcp:3000)
      

      【讨论】:

        【解决方案16】:

        找到打开的连接

        lsof -i -P | grep -i "听"

        按进程 ID 杀死

        kill -9 'PID'

        【讨论】:

          【解决方案17】:

          实现这一目标的可能方法:

          顶部

          top 命令是查看系统资源使用情况和查看占用系统资源最多的进程的传统方式。 Top 显示进程列表,使用 CPU 最多的进程位于顶部。

          ps

          ps 命令列出正在运行的进程。以下命令列出了系统上运行的所有进程:

          ps -A
          

          您还可以通过 grep 管道输出以搜索特定进程,而无需使用任何其他命令。以下命令将搜索 Firefox 进程:

          ps -A | grep firefox
          

          向程序传递信号最常用的方法是使用 kill 命令。

          kill PID_of_target_process
          

          lsof

          所有打开的文件和打开它们的进程的列表。

          lsof -i -P | grep -i "listen"
          kill -9 PID
          

           lsof -i tcp:3000 
          

          【讨论】:

            【解决方案18】:

            lsof -i tcp:port_number - 将列出该端口上运行的进程

            kill -9 PID - 将终止进程

            在你的情况下,它会是

            lsof -i tcp:3000 来自您的终端 查找进程的PID

            kill -9 PID

            【讨论】:

              【解决方案19】:

              这两个命令将帮助你找到并杀死服务器进程

              1. lsof -wni tcp:3000
              2. 杀死 -9 pid

              【讨论】:

              • 我的荣幸,阿希亚
              【解决方案20】:

              我为此做了一个小函数,将它添加到你的 rc 文件中(.bashrc.zshrc 或其他)

              function kill-by-port {
                if [ "$1" != "" ]
                then
                  kill -9 $(lsof -ni tcp:"$1" | awk 'FNR==2{print $2}')
                else
                  echo "Missing argument! Usage: kill-by-port $PORT"
                fi
              }
              

              然后你可以输入 kill-by-port 3000 来杀死你的 Rails 服务器(用 3000 代替它正在运行的任何端口)

              如果做不到这一点,您总是可以从 rails 根目录输入 kill -9 $(cat tmp/pids/server.pid)

              【讨论】:

              • 我必须使用反斜杠 \$PORT 才能正确显示消息。否则,效果很好!
              【解决方案21】:
              kill -9 $(lsof -ti:3000)
              

              总是在 macOS 上为我工作。

              如果您正在处理 node.js 项目,您可以将其添加到 package.json 脚本中,例如;

              "scripts": {
                  ...
                  "killme": "kill -9 $(lsof -ti:3000)",
                  ...
                },
              

              然后

              npm run killme
              

              --

              另外,如果您想为您的 macOS 添加系统范围的别名,请按照以下步骤操作;

              导航到您的主目录:

              cd ~
              

              使用 nano 或 vim 打开 .bash_profile 或 zsh 配置文件:

              vi .bash_profile
              

              添加别名(按 i):

              alias killme="kill -9 $(lsof -ti:3000)"
              

              保存文件

              重启终端

              在终端输入killme

              当然你可以把 3000 端口改成你想要的。

              【讨论】:

                【解决方案22】:

                添加到~/.bash_profile:

                function killTcpListen () {
                  kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
                }
                

                然后source ~/.bash_profile 运行

                killTcpListen 8080

                【讨论】:

                  【解决方案23】:

                  使用sindresorhusfkill工具,你可以这样做:

                  $ fkill :3000
                  

                  【讨论】:

                    【解决方案24】:

                    为我终止 node 工作(Mac OS Catalina)

                    killall -9 node
                    

                    【讨论】:

                      【解决方案25】:

                      TL;DR:

                      lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
                      

                      如果您处于同时有客户端和服务器使用该端口的情况,例如:

                      $ lsof -i tcp:3000
                      COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
                      node       2043 benjiegillam   21u  IPv4 0xb1b4330c68e5ad61      0t0  TCP localhost:3000->localhost:52557 (ESTABLISHED)
                      node       2043 benjiegillam   22u  IPv4 0xb1b4330c8d393021      0t0  TCP localhost:3000->localhost:52344 (ESTABLISHED)
                      node       2043 benjiegillam   25u  IPv4 0xb1b4330c8eaf16c1      0t0  TCP localhost:3000 (LISTEN)
                      Google    99004 benjiegillam  125u  IPv4 0xb1b4330c8bb05021      0t0  TCP localhost:52557->localhost:3000 (ESTABLISHED)
                      Google    99004 benjiegillam  216u  IPv4 0xb1b4330c8e5ea6c1      0t0  TCP localhost:52344->localhost:3000 (ESTABLISHED)
                      

                      那么你可能不想两个都杀了。

                      在这种情况下,您可以使用-sTCP:LISTEN 仅显示正在侦听的进程的 pid。将此与-t 简洁格式相结合,您可以自动终止该进程:

                      lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
                      

                      【讨论】:

                        【解决方案26】:

                        这是一个帮助 bash 函数,用于按名称或端口杀死多个进程

                        fkill() {
                          for i in $@;do export q=$i;if [[ $i == :* ]];then lsof -i$i|sed -n '1!p';
                          else ps aux|grep -i $i|grep -v grep;fi|awk '{print $2}'|\
                          xargs -I@ sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
                        }
                        

                        用法:

                        $ fkill [process name] [process port]
                        

                        例子:

                        $ fkill someapp :8080 node :3333 :9000
                        

                        【讨论】:

                          【解决方案27】:

                          要在 mac 上终止 3000 端口,请运行以下命令

                          kill -9 $(lsof -t -i:3000 -sTCP:LISTEN)

                          【讨论】:

                            【解决方案28】:

                            你应该试试这个,这个技术是独立于操作系统的。

                            在您的应用程序中有一个名为 tmp 的文件夹,其中还有一个名为 pids 的文件夹。 该文件包含服务器 pid 文件。 只需删除该文件。端口自动杀死自己。

                            我认为这是最简单的方法。

                            【讨论】:

                              【解决方案29】:

                              你可以试试这个

                              netstat -vanp tcp | grep 3000
                              

                              【讨论】:

                                【解决方案30】:

                                我最喜欢的单线: sudo kill `sudo lsof -t -i:3000`

                                【讨论】:

                                  猜你喜欢
                                  • 2016-05-20
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2021-07-24
                                  • 2018-01-13
                                  • 1970-01-01
                                  • 2012-02-28
                                  相关资源
                                  最近更新 更多