
有过Linux开发经验的开发者都知道,在Linux中命令操作是一种基础的入门技术。如果是早期接触Linux并与其一同不断成长的开发者可能理解更深刻,不同的版本或不同的系统都提供了各种各样的强大的命令。而且这些命令自身也在不断的发展,新的命令也在不断的升级或者替换成更强大的一些命令。
Linux中一切皆文件,这也意味着,如果有一个强大的文件处理命令,那么很多相关的操作都可以使用这个命令。正所谓,你能想到的,大佬也能想到。所以它来了,lsof,list open files(看英文就知道它大概是干啥的了)。这个命令相当强大,它可以把对普通文件、网络操作、管道等等相关的命令操作整合在一起。尽量减少使用者对命令过多种类的依赖。
其基础的应用格式如下:
lsof[选项][文件名|进程名|...]
其常见的选项参数包括:
其常见的输出选项有:
FD文件描述符的种类和说明:
前面介绍过不少的命令,它们其实都可以完成相同的功能。比如使用ss和netstat查看端口占用就可以使用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-9lsof -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-Pan-iTCP: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系统的人来说,接受并掌握一些命令操作,是一种必然的选择。