
快速预览 :本文整理了 Unix/Linux 系统
lsof和kill命令的常用用法,帮助你快速定位端口占用、终止僵尸进程、监控网络连接。文末附 shell 函数封装,一键杀掉占用端口的进程。
关键词 :lsof、kill、端口占用、进程管理、Linux命令、网络连接、DevOps、运维、端口查询
为什么要学这两个命令?
日常开发和运维中,经常遇到这些问题:
- ❌ 端口被占用,无法启动服务(
Address already in use) - ❌ 进程卡死,无法正常退出
- ❌ 需要查看哪些程序正在连接网络
- ❌ 找不到是哪个进程在操作某个文件
lsof(List Open Files)和 kill 正是解决这些问题的利器。
lsof - 列出打开的文件
lsof= Li st O pen Files - 在 Unix 中一切皆文件,包括网络连接
基本语法
bash
lsof [options]
按端口查询:查看端口被哪个进程占用
| 命令 | 说明 |
|---|---|
lsof -i :4006 |
查看占用 4006 端口的进程 |
lsof -i :4006 -P |
禁止端口名转换,直接显示数字 |
lsof -i TCP:4006 |
只看 TCP 端口 |
lsof -i UDP:53 |
只看 UDP 端口 |
lsof -i :80 -i :443 |
同时查看多个端口 |
按进程查询:查看特定进程打开的文件
| 命令 | 说明 |
|---|---|
lsof -p 15776 |
查看 PID 15776 打开的所有文件 |
lsof -p 1234 -p 5678 |
查看多个进程 |
lsof -c node |
查看 node 命令打开的文件 |
lsof -u username |
查看某用户打开的文件 |
lsof -u ^root |
排除 root 用户的文件 |
按网络查询:监控网络连接状态
| 命令 | 说明 |
|---|---|
lsof -i |
查看所有网络连接 |
lsof -i TCP |
只看 TCP 连接 |
lsof -i UDP |
只看 UDP |
lsof -i 4 |
只看 IPv4 |
lsof -i 6 |
只看 IPv6 |
lsof -i @192.168.1.1 |
查看指定主机的连接 |
lsof -i @127.0.0.1:4006 |
查看 IP 和端口 |
按文件/目录查询
| 命令 | 说明 |
|---|---|
lsof +D /path/to/dir |
递归查看目录下被打开的文件 |
lsof /var/log/syslog |
查看谁在使用特定文件 |
lsof +L1 |
查找已删除但仍被打开的文件 |
其他常用选项
| 选项 | 说明 |
|---|---|
-t |
只输出 PID,简化结果 |
-l |
不转换用户 ID |
-n |
不解析主机名 |
-v |
显示版本信息 |
lsof 输出字段含义
sql
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 15776 ruofengwang 25u IPv4 0x44179c2679b65508 0t0 TCP localhost:4006 (LISTEN)
| 字段 | 说明 |
|---|---|
| COMMAND | 打开该端口的命令名 |
| PID | 进程 ID |
| USER | 运行该进程的用户 |
| FD | 文件描述符(25u = fd 25,可读写) |
| TYPE | 文件类型(IPv4/IPv6/CHR 等) |
| NODE NAME | 网络地址或文件路径 |
kill - 终止进程
基本用法:如何杀掉进程
bash
kill [signal] PID
常用信号:SIGTERM vs SIGKILL
| 信号 | 命令 | 含义 |
|---|---|---|
| SIGTERM | kill PID / kill -15 PID |
默认信号,优雅关闭,允许清理资源 |
| SIGKILL | kill -9 PID |
强制立即终止,不保存数据 |
| SIGHUP | kill -1 PID |
重新加载配置 |
| SIGINT | kill -2 PID |
中断信号(同 Ctrl+C) |
杀掉占用指定端口的进程(实用技巧)
bash
# 方法一:获取 PID 后 kill
lsof -ti :4006 | xargs kill
# 方法二:强制杀掉
kill -9 $(lsof -ti :4006)
# 方法三:使用 fuser
fuser -k 4006/tcp
封装成 shell 函数(添加到 ~/.zshrc)
bash
# 杀掉指定端口的进程
killport() {
local port=$1
local pid=$(lsof -ti :$port)
if [ -n "$pid" ]; then
kill -9 $pid
echo "Killed process $pid on port $port"
else
echo "No process found on port $port"
fi
}
# 使用
killport 4006
其他常用 kill 命令组合
bash
# 杀掉所有 node 进程
killall node
# 杀掉某用户的所有进程
pkill -u username
# 按名称杀进程
pkill -f "process name"
# 列出所有信号
kill -l
实用技巧与常见场景
场景 1:查看并释放被占用的端口
bash
# 查看
lsof -i :4006
# 杀掉
kill -9 $(lsof -ti :4006)
场景 2:查找已删除但未释放的文件(释放磁盘空间)
bash
# 找出占用已删除文件的进程
lsof +L1
# 根据结果 kill 进程以释放磁盘空间
场景 3:设置快捷别名(提高效率)
bash
alias port='lsof -i'
alias portkill='killport'
⚠️ 注意 :优先使用
kill(SIGTERM)让进程优雅退出,kill -9(SIGKILL)不会保存数据或清理资源。