关于macos:在Mac上查找(并终止)进程锁定端口3000

Find (and kill) process locking port 3000 on Mac

如何找到(并杀死)侦听/使用我的TCP端口的进程?我在Mac OS X上。

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

什么时候做

1
rails server

我得到

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

2014更新:

要完成以下部分答案:执行kill命令后,可能需要删除pid文件rm ~/mypath/myrailsapp/tmp/pids/server.pid


  • 你可以试试netstat

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

    1
    sudo lsof -i tcp:3000
  • 用于CentOS 7

    1
    netstat -vanp --tcp | grep 3000

  • 查找:

    1
    [sudo] lsof -i :3000

    杀戮:

    1
    kill -9 <PID>


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

    运行:

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

    然后检查报告PID的状态:

    1
    ps ax | grep <PID>

    最后,"开始吧":

    1
    kill -QUIT <PID>


    一个使用端口3000提取过程PID并杀死它的一行程序。

    1
    lsof -ti:3000 | xargs kill

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


    您可以使用lsof -i:3000

    这就是"列出打开的文件"。这将为您提供进程列表以及它们使用的文件和端口。


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

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

    然后,如果它被阻塞,就给$terminate打电话。


    要强制终止这样的进程,请使用以下命令

    1
    lsof -n -i4TCP:3000

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

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

    1
    kill -9"PID"

    用运行第一个命令后得到的数字替换pid

    For Instance, if I want kill the process running on port 8080


    这个命令行很容易记住:

    npx kill-port 3000

    要获得更强大的搜索工具:

    npx fkill-cli

    PS:他们使用第三方的javascript包。npx内置node.js。

    来源:tweet github


    1
    lsof -P | grep ':3000' | awk '{print $2}'

    这只会给你PID,在MacOS上测试。


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

    1
    2
    3
    4
    5
    6
    # install freeport
    pip install freeport

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


    在OS-X EL上尉的命令行中执行:

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

    lsof的terse选项只返回pid。


    要查看阻塞端口的进程:

    netstat -vanp tcp | grep 3000

    要终止阻塞端口的进程:

    kill $(lsof -t -i :3000)


    找到打开的连接

    lsof -i -P | grep -i"listen"

    按进程ID终止

    kill -9 'PID'


    找到pid并终止进程。

    1
    lsof -ti:3000 | xargs kill


    寻找和杀戮:

    这个单一的命令行很容易,并且工作正常。

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

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

    顶部

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

    聚苯乙烯

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

    1
    ps -A

    您还可以通过grep管道输出,以在不使用任何其他命令的情况下搜索特定进程。以下命令将搜索firefox进程:

    1
    ps -A | grep firefox

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

    1
    kill PID_of_target_process

    最小二乘法

    所有打开的文件及其打开过程的列表。

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

    1
     lsof -i tcp:3000

    简易解决方案:使用单行命令杀死多个端口。

    1
    kill $(lsof -t -i:3000,3001) // 3000 and 3001 are the ports to be freed

    lsof -t -i:3000

    八万二千五百

    lsof -t -i:3001

    八万二千四百九十九

    lsof -t -i:3001,3000

    八万二千四百九十九八万二千五百

    kill $(lsof -t -i:3001,3000)

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

    lsof -t -i:3000

    lsof -t -i:3001

    您可以在package.json脚本中使用它

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


    使用sindresorhus的fkill工具,可以执行以下操作:

    1
    $ fkill :3000

    添加到~/.bash_profile中:

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

    然后source ~/.bash_profile运行

    killTcpListen 8080


    DR:

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

    如果您处于客户机和服务器都在使用端口的情况下,例如:

    1
    2
    3
    4
    5
    6
    7
    $ 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。将它与-tterse格式结合使用,可以自动终止进程:

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

    我为此做了一些功能,将其添加到您的rc文件(.bashrc.zshrc或其他什么文件中)

    1
    2
    3
    4
    5
    6
    7
    8
    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)


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

    在应用程序的一侧有一个名为tmp的文件夹,其中还有一个名为pids的文件夹。该文件包含服务器PID文件。只需删除该文件即可。端口自动终止。

    我认为这是一个简单的方法。


    这里有一个助手bash函数,可以按名称或端口杀死多个进程。

    1
    2
    3
    4
    5
    6
    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
    " $q @';done
    }

    用途:

    1
    $ fkill [process name] [process port]

    例子:

    1
    $ fkill someapp :8080 node :3333 :9000

    如果您想要无代码方式-打开活动管理器并强制杀死节点:)


    使用以下命令终止端口3000上的进程kill $(lsof -t -i:3000)


    在Mac OS中

    kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')


    步骤1:查找正在运行的服务器:ps aux | grep puma步骤2:杀死那些服务器kill-9[服务器编号]


    您应该使用终端尝试此代码:

    1
    $ killall -9 ruby