查看端口 :lsof -i:8080
lsof = List Open Files(列出已打开的文件)。 在 Unix/macOS 里,"一切皆文件"——网络连接(socket)、管道、设备、普通文件,全都算"打开的文件"。所以 lsof 不只是看文件,也能看网络。
-i = 只看跟网络(Internet)相关的"文件",也就是 socket。
:8080 = 过滤条件,只看端口号是 8080 的。
合起来就是:"列出所有跟 8080 端口有关的网络连接,以及背后是哪个进程在用"。

lsof -ti :8080 — 同上,但只输出 PID
多了一个 -t: -t = terse模式(简洁模式),只输出 PID,别的列全部不打印。
这样输出就变成纯数字,比如: 79739
这种"纯数字输出"特别方便接到下一个命令,所以才有了下面的组合用法。
lsof -ti :8080 | xargs kill -9 一条命令直接杀掉
这是三段组合,我拆开讲:
管道 |
| 叫管道(pipe)。意思是:把前一个命令的输出,作为后一个命令的输入。
举例:
lsof -ti :8080 输出 79739
| xargs kill -9 把 79739 喂给后面的命令
xargs = extended argsuments。
为什么需要它?因为 kill 命令只接受参数(参数 = 写在命令后面的东西,比如 kill 79739 里的 79739),它不接受标准输入。直接写 lsof -ti :8080 | kill -9 是不行的,kill 不会读管道里的内容。
xargs 的作用就是:把管道里来的内容,转换成下一个命令的参数。
所以 xargs kill -9 实际上等价于:
kill -9 79739
kill -9 kill = 给进程发信号。它的名字虽然叫 "kill",但本质是"发信号",不一定是杀。
kill 79739(不带 -9)→ 默认发 SIGTERM(信号 15),意思是"请你优雅地退出"。进程可以接到这个信号后清理资源(关闭数据库连接、刷盘、释放端口),然后自己退出。推荐先试这个。
kill -9 79739 → 发 SIGKILL(信号 9),意思是"立刻死,没得商量"。进程没办法捕获或忽略这个信号,操作系统直接把它干掉。代价是它来不及做清理工作。
类比:
kill(SIGTERM)= 跟同事说"你下班了,把东西收拾收拾走"。
kill -9(SIGKILL)= 保安直接把人拖走。
实际经验:JVM/Spring Boot 一般用 kill(SIGTERM)就能停下来。如果 5–10 秒还没退,再上 kill -9。




为什么要这么设计?
因为 -i 这个参数要表达的信息有好几个维度(IP 版本、协议、主机、端口),不能光靠空格分开(空格在 shell 里有特殊含义,会被当成多个参数)。所以 lsof 借鉴了 URL 的写法:

这跟你写 URL 的 http://localhost:8080 是一个思路——冒号永远引导端口。