这种场景经常见到,比如执行umount,发现被占用,想找到被谁占用。
使用fuser来查文件或目录被谁占用
fuser /proc
/proc: 2454rc
参数:-v 显示用多信息,-u 显示用户
# fuser -uv /proc
用户 进程号 权限 命令
/proc: rtkit 2454 .rc.. (rtkit)rtkit-daemon
想要显示/proc目录下所有文件和目录被占用情况,加-m参数
# fuser -uvm /proc
用户 进程号 权限 命令
/proc: root 1311 f.... (root)rsyslogd
root 1667 f.... (root)vmtoolsd
root 2028 f.... (root)acpid
haldaemon 2040 f.... (haldaemon)hald
root 2297 F.... (root)Xorg
rtkit 2454 .rc.. (rtkit)rtkit-daemon
root 2659 f.... (root)nautilus
root 2673 f.... (root)udisks-daemon
root 2712 f.... (root)gnome-power-man
使用删除某个PID,加-k参数,加入-i,配合-k会询问用户意愿
# fuser -ki /proc
/proc: 2454rc
杀死进程 2454 ? (y/N) n
lsof的使用
lsof列出被进程所打开的文件,直接运行,输出内容很多
加参数-u找某个用户的进程
# lsof -u root|more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 253,0 4096 2 /
init 1 root rtd DIR 253,0 4096 2 /
init 1 root txt REG 253,0 150352 4560 /sbi
n/init
...
+d 参数,找某个目录被打开的文件
-a 多个条件同时成立,例如找root用户打开/proc的情况
# lsof +d /proc -a -u root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1311 root 3r REG 0,3 0 4026532038 /proc/kmsg
vmtoolsd 1667 root 16r REG 0,3 0 4026532032 /proc/meminfo
vmtoolsd 1667 root 17r REG 0,3 0 4026532033 /proc/stat
vmtoolsd 1667 root 18r REG 0,3 0 4026532020 /proc/vmstat
Xorg 2297 root 5w REG 0,3 0 4026531957 /proc/mtrr
udisks-da 2673 root 7r REG 0,3 0 4026531977 /proc/mdstat
gnome-pow 2712 root 15r REG 0,3 0 4026532033 /proc/stat
lsof 24962 root 3r DIR 0,3 0 1 /proc
还有个参数-U ,用来列出socket文件类型。