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文件
你可以试试
1 | netstat -vanp tcp | grep 3000 |
对于MacOS El Capitan和更新版本(或者如果您的netstat不支持
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之外的所有内容,从而很容易杀死它。
您可以使用
这就是"列出打开的文件"。这将为您提供进程列表以及它们使用的文件和端口。
在您的
1 2 3 | terminate(){ lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 } |
然后,如果它被阻塞,就给
要强制终止这样的进程,请使用以下命令
1 | lsof -n -i4TCP:3000 |
其中3000是进程运行的端口号
这将返回进程ID(PID)并运行
1 | kill -9"PID" |
用运行第一个命令后得到的数字替换pid
这个命令行很容易记住:
要获得更强大的搜索工具:
PS:他们使用第三方的javascript包。
来源: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。
要查看阻塞端口的进程:
要终止阻塞端口的进程:
找到打开的连接
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
您可以在
"start":"kill $(lsof -t -i:3000,3001) && npm start"
}
使用sindresorhus的fkill工具,可以执行以下操作:
1 | $ fkill :3000 |
添加到
1 2 3 | function killTcpListen () { kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t) } |
然后
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) |
那你可能不想两个都杀了。
在这种情况下,您可以使用
1 | lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill |
我为此做了一些功能,将其添加到您的rc文件(
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 } |
然后,您只需键入
如果失败,您可以从rails根目录中键入
你应该试试这个,这个技术是独立于操作系统的。
在应用程序的一侧有一个名为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上的进程
在Mac OS中
步骤1:查找正在运行的服务器:
您应该使用终端尝试此代码:
1 | $ killall -9 ruby |