如何找到(并杀死)侦听/使用我的TCP端口的进程?我在Mac OS X上。
有时,在崩溃或某些错误之后,我的Rails应用程序锁定了端口3000。我无法使用ps -ef找到它。
做的时候
rails server
我懂了
地址已在使用中-bind(2)(Errno :: EADDRINUSE)
2014年更新:
要完成以下一些答案:在执行kill命令之后,可能需要删除pid文件。 rm ~/mypath/myrailsapp/tmp/pids/server.pid
如何找到(并杀死)侦听/使用我的TCP端口的进程?我在Mac OS X上。
有时,在崩溃或某些错误之后,我的Rails应用程序锁定了端口3000。我无法使用ps -ef找到它。
做的时候
rails server
我懂了
地址已在使用中-bind(2)(Errno :: EADDRINUSE)
2014年更新:
要完成以下一些答案:在执行kill命令之后,可能需要删除pid文件。 rm ~/mypath/myrailsapp/tmp/pids/server.pid
Answers:
你可以试试 netstat
netstat -vanp tcp | grep 3000
对于macOS El Capitan和更高版本(或者如果您的netstat不支持-p
),请使用lsof
sudo lsof -i tcp:3000
对于Centos 7使用
netstat -vanp --tcp | grep 3000
lsof -t -i tcp:#{ARGV.first} | xargs kill
)
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
sudo
如果看不到任何输出,请务必在lsof之前尝试
-P
到lsof
命令,以便在输出中可见原始端口:lsof -P -i:3000
找:
sudo lsof -i :3000
杀:
kill -9 <PID>
kill -15 <PID>
之前-9
。
kill <PID>
不足够/危险/不完整?
kill -15
使该过程有机会自行清理。
-9
。
以上对我没有任何帮助。有我经验的任何人都可以尝试以下操作(为我工作):
跑:
lsof -i :3000 (where 3000 is your current port in use)
然后检查报告的PID的状态:
ps ax | grep <PID>
最后,“随它去”:
kill -QUIT <PID>
kill -TERM
(或只是kill
)之前kill -QUIT
。并非每个进程都会在SIGQUIT上有序关闭。
单线使用端口3000提取进程的PID并终止它。
lsof -ti:3000 | xargs kill
-t标志从lsof输出中除去PID以外的所有内容,从而很容易杀死它。
lsof -ti:3000 -sTCP:LISTEN
最简单的解决方案:
对于单端口:
kill $(lsof -ti:3000) #3000 is the port to be freed
使用单行命令杀死多个端口:
kill $(lsof -ti:3000,3001) #here multiple ports 3000 and 3001 are the ports to be freed
lsof -ti:3000
82500(进程ID / PID)
lsof -ti:3001
82499
lsof -ti:3001,3000
82499 82500
杀死$(lsof -ti:3001,3000)
在单个命令中终止82499和82500进程。
在package.json
脚本中使用此命令:
"scripts": {
"start": "kill $(lsof -ti:3000,3001) && npm start"
}
单个命令行很容易记住:
npx kill-port 3000
有关搜索的更强大工具:
npx fkill-cli
PS:他们使用第三方javascript程序包。npx
随Node.js内置。
npx
带有npm
附带node.js
,所以它不是一个分隔的包。只需升级您的node.js和您的npm版本。
在中.bash_profile
,为terminate
3000流程创建一个快捷方式:
terminate(){
lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9
}
然后,$terminate
如果被阻止,请致电。
要强制终止此类进程,请使用以下命令
lsof -n -i4TCP:3000
其中3000是该进程运行的端口号
这将返回进程ID(PID)并运行
kill -9 "PID"
将PID替换为运行第一个命令后获得的数字
lsof -P | grep ':3000' | awk '{print $2}'
这只会给您在MacOS上测试过的pid。
lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
杀死端口上的进程的一种方法是使用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
lsof -t -i:3000
.. 的包装,似乎没有必要。
要查看阻塞端口的进程:
netstat -vanp tcp | grep 3000
要终止阻塞端口的进程:
kill $(lsof -t -i :3000)
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
但是,它将适用于大多数Linux发行版
3000
被占用,它可以正常工作。但是,如果没有进程阻止该端口,则将kill: not enough arguments
出现错误。
netstat -vanp tcp | grep 3000
,您是否为被占用的端口获得了有效的PID ?
bash
和zsh
外壳。对我来说很好。不知道为什么它不适合您。High Sierra可能对您有所帮助?我不知道:/
查找并杀死:
这个单一的命令行很简单并且可以正常工作。
kill -9 $(lsof -ti tcp:3000)
实现此目的的可能方法:
最佳
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
使用sindresorhus的fkill工具,您可以执行以下操作:
$ fkill :3000
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
我给这个一点点功能,将它添加到您的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替换它正在运行的任何端口)
否则,您总是可以kill -9 $(cat tmp/pids/server.pid)
从rails根目录中键入
\$PORT
以使消息正确显示。否则,效果很好!
这是一个帮助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
我用这个:
cat tmp/pids/server.pid | pbcopy
然后
kill -9 'paste'
function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }