Answers:
找出占用您要释放的端口号(例如5955)的进程ID(PID)
sudo lsof -i :5955
使用其PID终止当前正在使用端口的进程
sudo kill -9 PID
kill PID
(表示-15),然后尝试-2和-1。-9是只有在万不得已的每个其他选项未能奏效。
无论您打开端口,还是以相同的方式关闭它。例如,如果您创建了一个套接字,将其绑定到端口0.0.0.0:5955,然后调用listen,请关闭该套接字。
您也可以只取消打开端口的进程。
如果要找出打开端口的进程,请尝试以下操作:
lsof -i :5955
如果您想知道端口是否打开,则可以执行相同的lsof命令(如果有任何进程将其打开,则打开;否则,它不会打开),或者您可以尝试连接到该端口,例如:
nc localhost 5955
如果它立即返回但没有输出,则说明该端口未打开。
值得一提的是,从技术上讲,它不是开放的端口,而是host:port组合。例如,如果您以10.0.1.2的方式插入LAN,则可以将套接字绑定到127.0.0.1:5955或10.0.1.2:5955,而一个都不影响另一个,也可以绑定到0.0.0.0 :5955可同时处理这两个问题。您可以使用以下ifconfig
命令查看计算机的所有IPv4和IPv6地址。
在2018年,这是使用MacOS HighSierra对我有用的功能:
须藤lsof -nPi:yourPortNumber
然后:
sudo kill -9 yourPIDnumber
lsof -nPi
稍微好一点,因为端口号实际上在输出中可见,并且您可以更好地了解要杀死的内容。
sudo lsof -nPi | grep LISTEN
您还可以使用以下第一个命令来杀死拥有特定端口的进程:
sudo netstat -ap | grep :<port_number>
例如,假设此进程保留端口8000 TCP,然后运行以下命令:
sudo netstat -ap | grep :8000
将输出与进程保持端口8000相对应的行,例如:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
在这种情况下,procHoldingPort是打开端口的进程的名称,4683是其pid,而8000(请注意它是TCP)是其持有的端口号(您希望关闭)。
然后按照上面的示例杀死该进程:
kill 4683
正如其他人在这里提到的那样,如果那行不通(您可以尝试使用带有-9作为参数的kill):
kill -9 4683
同样,通常最好避免发送SIGKILL(-9)。
干杯,
伙计
如上所述,我lsof
将与结合使用kill
;但是写了一个快速的bash脚本来自动化这个过程。
使用此脚本,您只需killport 3000
在任何地方键入即可,它将杀死port上运行的所有进程3000
。
lsof
,与结合使用kill
并没有返回任何内容,并使我的脚本在macOS Sierra上挂起。但是,它的killport
工作原理就像一种魅力,而且速度更快。谢谢!
我为此创建了一个函数。
function free_port() {
if [ -z $1 ]
then
echo no Port given
else
PORT=$1;
PID=$(sudo lsof -i :$PORT) # store the PID, that is using this port
if [ -z $PID ]
then
echo port: $PORT is already free.
else
sudo kill -9 $PID # kill the process, which frees the port
echo port: $PORT is now free.
fi
fi
}
free_port 80 # you need to change this port number
在终端中复制并粘贴此代码块可以释放所需的端口。只记得在最后一行更改端口号。