一、linux中命令操作
有过Linux开发经验的开发者都知道,在Linux中命令操作是一种基础的入门技术。如果是早期接触Linux并与其一同不断成长的开发者可能理解更深刻,不同的版本或不同的系统都提供了各种各样的强大的命令。而且这些命令自身也在不断的发展,新的命令也在不断的升级或者替换成更强大的一些命令。
二、lsof命令
Linux中一切皆文件,这也意味着,如果有一个强大的文件处理命令,那么很多相关的操作都可以使用这个命令。正所谓,你能想到的,大佬也能想到。所以它来了,lsof,list open files(看英文就知道它大概是干啥的了)。这个命令相当强大,它可以把对普通文件、网络操作、管道等等相关的命令操作整合在一起。尽量减少使用者对命令过多种类的依赖。
其基础的应用格式如下:
lsof [选项] [文件名|进程名|...]
其常见的选项参数包括:
| 选项 | 含义 | 示例 |
|---|---|---|
| -i | 查看网络文件/socket | lsof -i |
| -i :端口 | 查看指定端口 | lsof -i :8080 |
| -i TCP | 查看 TCP 连接 | lsof -i TCP |
| -i UDP | 查看 UDP 连接 | lsof -i UDP |
| -i4 | 只查看 IPv4 | lsof -i4 |
| -i6 | 只查看 IPv6 | lsof -i6 |
| -P | 不把端口号转换为服务名 | lsof -P -i :80 |
| -n | 不解析主机名 | lsof -n -i |
| -p | 按 PID 查询 | lsof -p 1234 |
| -u | 按用户查询 | lsof -u fpc |
| -c | 按进程名查询 | lsof -c nginx |
| -a | 多个条件取交集 | lsof -a -u fpc -i |
| +D | 递归查看目录下被打开的文件 | lsof +D /mnt/data |
| +d | 只查看指定目录本层,不递归 | lsof +d /var/log |
| +L1 | 查看已删除但仍被占用的文件 | lsof +L1 |
| -sTCP:LISTEN | 查看 TCP 监听状态 | lsof -iTCP -sTCP:LISTEN |
| -sTCP:ESTABLISHED | 查看已建立 TCP 连接 | lsof -iTCP -sTCP:ESTABLISHED |
| -t | 只输出 PID | lsof -t -i :8080 |
| -r | 持续刷新输出 | lsof -r 2 -i :8080 |
| -F | 机器可读格式输出 | lsof -F -p 1234 |
其常见的输出选项有:
| 字段 | 含义 |
|---|---|
| COMMAND | 进程名 |
| PID | 进程ID |
| USER | 所属用户 |
| FD | 文件描述符,如0:stdin,cwd:当前目录等 |
| TYPE | 文件类型,DIR:目录,IPv4:网络套接字等 |
| DEVICE | 设备号 |
| SIZE/OFF | 文件大小或偏移量 |
| NODE | inode 号 |
| NAME | 文件名、端口、连接等 |
FD文件描述符的种类和说明:
| FD | 含义 |
|---|---|
| cwd | 当前工作目录 |
| txt | 程序可执行文件 |
| mem | 内存映射文件 |
| 0u | 标准输入 |
| 1u | 标准输出 |
| 2u | 标准错误 |
| 3u | 第 3 个文件描述符,可读写 |
| r | 只读 |
| w | 只写 |
| u | 读写 |
前面介绍过不少的命令,它们其实都可以完成相同的功能。比如使用ss和netstat查看端口占用就可以使用lsof命令来替代。
三、lsof命令的应用
lsof命令可以支持的常见操作文件类型包括:普通文件,文件目录,网络,管理,设备文件以及动态库和进程文件等等。不建议什么命令选项都不使用的调用lsof命令,它会出现大量的结果,让屏幕根本看不到想关心的部分。
其常见的应用场景有:
-
查看网络的连接状态
lsof -i tcp #查看所有TCP连接 lsof -i udp lsof -i TCP -sTCP:LISTEN #查看正在监听的TCP端口 lsof -i TCP -sTCP:ESTABLISHED #查看已建立连接 -
端口进程占用的情况
lsof -i :8888 #查看指定端口占用者 -
进程占用的文件状态
这个非常实用:lsof -p 3717 #查看利用PID打开的文件 lsof -c obsidian #查看利用进程名打开的文件 lsof -u test #查看test用户打开的文件 lsof +D ~/data #查看指定目录下的文件被哪些进程占用,这在进程占用文件无法删除时非常有用 #可以进一步操作:删除所有占用指定文件的进程(小心处理) kill -9 `lsof -t /path/file` -
磁盘空间的文件占用状态,特别是已删除的文件
这个也非常好使,用处非常大:lsof | grep deleted #删除但未释放文件 lsof +L1 # 精确查找 lsof /mnt/demo #指定挂载点进程占用 lsof -f -- /dev/sda2 #全部挂载点的使用 -
文件无法卸载或删除
可以混合使用上面的文件、目录和进程占用等命令,查找到相关原因,再进行卸载和删除:lsof -c obsidian lsof +D ~/data lsof /mnt/demo kill -9 `lsof -t /path/file` #删除 apt remove package-name #卸载
四、命令的高级应用
在Linux中通过多个命令的组合可以实现更复杂更精细的命令处理,实现高级的应用。下面看一下lsof的常见的组合高级应用:
-
查找大文件
这个在服务器开发中用处非常大,用来过滤一些对空间有影响的大文件:lsof | awk '$7 ~ /^[0-9]+$/ && $7 > 1000000 {print $2, $7, $9}' | sort -k2 -nr -
高级的网络用法
lsof -Pan -i TCP:9999 -sTCP:LISTEN # 查看9999端口的监听进程 lsof -Pan -iTCP -sTCP:LISTEN # 查看全部监听端口 lsof -Pan -p 3717 -i #指定进程监听哪些端口 lsof -r 5 -i:8080 #5秒刷新查看
在实际的工作中,可以通过各种高级的组合用法,甚至开发成脚本,共同完成指定的任务需求。其实大家不必担心过于复杂,现在AI的引入,使得脚本的开发几乎变成了一个非常简单的行为。
五、实践中的问题
lsof命令虽然很强大,但也有一些限制情况。比如在查看某些文件时,需要root权限,而且其输出相对要复杂很多,除了常见的一些字段,其内容说明很多。这就需要应用者能够仔细的查看相关的说明文档(当然,现在直接可以问AI)。当然,lsof也存在着很多命令同样的缺点,就是直接使用它,有可能会影响到监控的系统的性能,甚至导致出现一些异常。这都需要应用者自行处理和决定。"工具虽好,但也不能乱用"。
六、总结
对于习惯于图形界面应用或开发的人来说,对于命令操作一般都会有一些抵触心理。其实命令操作并不难,常见的命令也没有想象的那么多。特别在一些服务器环境中,只能使用命令进行操作。所以对于想接触Linux系统的人来说,接受并掌握一些命令操作,是一种必然的选择。