启动程序时突然弹出 “端口已被占用”,是不是特让人抓狂?好不容易用 netstat 查出哪个端口被占了,却不知道怎么关掉那个进程,新手朋友估计得急得直跺脚。小编前几天帮同事处理这问题,他在 Windows 上折腾半天没搞定,换成 Linux 又一脸懵 —— 其实啊,Windows 和 Linux 关闭进程的步骤确实有点不一样,但都不算难,今天就一步步教你,看完你也能轻松搞定!
先复习下:怎么用 netstat 查出占用端口的进程?
不管是 Windows 还是 Linux,想关进程先得知道谁在占用端口,这步得用 netstat,简单说两句:
在 Windows 的命令提示符里输 “netstat -ano | findstr “端口号””,比如查 8080 端口就输 “netstat -ano | findstr “8080””,结果里 “LISTENING” 后面的数字就是进程 ID(比如 1234)。
在 Linux 的终端里输 “netstat -tunlp | grep 端口号”,比如 “netstat -tunlp | grep 8080”,会直接显示进程名和 ID(比如 “java 1234”)。
记不住也没关系,用到时翻出来看看,先把这步搞定,才能往下关进程。
Windows 下:三步搞定,任务管理器是好帮手
Windows 关进程相对直观,图形界面操作多,新手容易上手,小编分步骤给你说:
(1)用 netstat 找到进程 ID(PID)
就像刚才说的,打开命令提示符(Win+R 输 “cmd”),输 “netstat -ano | findstr “端口号””。比如你要开的程序需要用 8080 端口,输完命令后,假设看到 “TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 1234”,那 1234 就是你要找的 PID。
小编上次查 8080 端口,PID 是 1234,记下来就行,这步不难吧?
(2)打开任务管理器,找到对应的进程
按 Ctrl+Shift+Esc 直接打开任务管理器,点 “详细信息” 标签,这里能看到 “PID” 列,找到刚才记的 1234,旁边就是进程名,比如 “java.exe”—— 这就是占用 8080 端口的家伙。
要是没看到 PID 列,右键点表头(比如 “名称”),勾选 “PID” 就行,很简单的。
(3)强制关闭进程,一步到位
右键点那个进程,选 “结束任务”,弹出来的确认框点 “是”,搞定!这时候再启动你的程序,应该就不会提示端口被占用了。
有个新手朋友跟我说,他点了 “结束任务” 没反应,咋办?你试试右键选 “结束进程树”,有时候进程有子进程,得一起关掉才行,小编试过,这招特管用。
Linux 下:全靠命令行,但记住两句就行
Linux 没有图形界面的任务管理器(当然也有,但新手可能找不到),全靠命令行操作,看着复杂,其实就两句命令的事。
(1)用 netstat 找到进程 ID(PID)
打开终端,输 “sudo netstat -tunlp | grep 端口号”。比如查 80 端口,输 “sudo netstat -tunlp | grep 80”,会显示类似 “tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5678/nginx”,这里 5678 就是 PID,nginx 是进程名。
输命令时可能要输密码,别慌,输的时候屏幕不显示,输完回车就行,Linux 都这样。
(2)用 kill 命令强制关掉进程
直接输 “sudo kill -9 5678”(5678 换成你的 PID),回车 —— 搞定!“-9” 就是强制关闭的意思,跟 Windows 里 “结束进程树” 差不多。
小编第一次用 Linux 时,输完 kill 命令没反应,后来才发现 PID 输错了,你输的时候多核对两遍,准没错。要是还关不掉,试试 “sudo kill -9 -5678”(在 PID 前加个 “-”),这是关掉整个进程组,一般都能解决。
两者步骤对比:一张表看明白区别
步骤 | Windows 系统 | Linux 系统 |
---|---|---|
查进程 ID | netstat -ano | findstr “端口号” | sudo netstat -tunlp | grep 端口号 |
关进程工具 | 任务管理器(图形界面) | kill 命令(命令行) |
强制关闭方式 | 右键 “结束进程树” | sudo kill -9 PID |
特殊情况处理 | 重启任务管理器重试 | 用 kill -9 -PID 关闭进程组 |
你看,Windows 靠鼠标点,Linux 靠命令输,核心都是先找 PID 再关进程,只是操作方式不一样。
新手常遇到的问题:关不掉咋办?
(1)进程 “杀不死”,提示 “拒绝访问”
Windows 里遇到这情况,多半是没以管理员身份运行命令提示符。你右键 “命令提示符”,选 “以管理员身份运行”,再关进程试试,小编上次就是这么解决的。
Linux 里提示 “permission denied”,加个 “sudo” 就行,比如 “sudo kill -9 5678”,管理员权限啥都能搞定。
(2)关掉进程后,端口还是被占用
这可能是进程没彻底关掉,或者有残留。Windows 里你重启下电脑,基本能解决;Linux 里输 “sudo netstat -tunlp | grep 端口号” 再查一次,要是还有,换个 PID 再 kill 一次,小编遇到过一次,连杀两次就好了。
(3)不知道端口对应的程序,不敢乱关
别慌,查 PID 的时候,Windows 任务管理器里能看到进程名(比如 “java.exe” 可能是 Tomcat),Linux 里 netstat 结果直接显示进程名(比如 “nginx”),根据名字判断是不是你要关的程序,不确定就先百度下进程名是啥,再动手。
小编的实在话
其实不管是 Windows 还是 Linux,只要记住 “先找 PID,再强制关” 这两步,基本都能搞定。Windows 用鼠标点着方便,Linux 命令行看着酷,新手不用怕命令行,多输两次就熟了。
遇到问题别慌,多试几次,实在不行重启电脑 —— 小编跟你说,重启有时候比啥都管用。关进程前最好确认下,别把系统进程关了,不然可能出麻烦。多练两次,你也能像老手一样,两分钟解决端口占用问题,真的不难!