lsof 解析

lsof(list opened files),看名字就是知道是做什么的了。在 Linux 下 everything is file:普通的文件,块/字符设备,管道等等都是文件。

$ lsof | wc -l
系统打开文件数目

$ lsof file
显示开启文件 file 的进程

$ lsof /usr/bin/vi
现实 vi 命令打开的文件

$ lsof -c ssd
显示 sshd 进程现在打开的文件

$ lsof -c -t sshd
显示 sshd 的进程

$ lsof -p 1111  
看进程号为 1111 的进程打开了哪些文件:

$ lsof -u root
$ lsof -u 0
root 用户打开的文件

$ lsof -u ^root
非 root 打开的文件

用的最多的就是 -i 选项了,后面接:
[46][protocol][@hostname|hostaddr][:service|port]

$ lsof -i -P -n | cut -d " " -f 1 | uniq | tail -n +2
当前网络进程

$ lsof -i:1-65535
查看端口占用

$ lsof i:80 | grep -v "PID" | awk '{print "kill -9",$2}' | sh
杀死 80 进程

在 umount 设备的时候遇到“device is busy”的提示,可以 lsof 找出占用该设备的进程,通过上面的那条管道命令将其杀死就可以 umount 了。