fuser根据目录或者文件来查看打开的程序和用户,如果在umount一个设备时出现busy,就可以利用fuser来查看被什么程序给占用了。
实验
进入lvm后,又去umount /lvm是肯定不行,也可以透过这样看到fuser的用法
[root@localhost ~]# cd /lvm
[root@localhost lvm]# umount /lvm
umount:
/lvm: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
[root@localhost lvm]# fuser -uv /lvm
USER PID ACCESS COMMAND
/lvm: root 3143 ..c.. (root)bash
参数u是显示程序的执行者
参数v则显示列名,比较详细,除非用于SHELL编程,否则建议使用它增强可读性
另外还有
参数m,可以上提到文件最顶目录,查看占用程序;
参数k,试图使用SIGKILL去终止占用的程序;
参数i,配合k参数询问是否终止程序;
参数signal,例如-1、-9、-15,具体参考kill命令
输出的结果中,3143是占用程序的PID,可透过ps去查,可见占用的程序是bash
[root@localhost lvm]# ps aux | grep 3143
root 3143 0.0 0.1 5232 1708
pts/1 Ss 20:58 0:00
-bash
..c..其实是五个位,每个位代表不同的意思
c代表这个程序就在当前目录下
e可被触发为执行状态
f是一个被开启的档案
r代表顶层目录
F档案被开启,并且等待回应
m可能为动态函数库
vim一个新文件,然后按ctrl+z的效果
[root@localhost lvm]# fuser -uv .test.swp
USER PID
ACCESS COMMAND
.test.swp: root 3209 F....
(root)vim
使用tail
-f去监视一个文件的结尾,然后ctrl+z的效果
[root@localhost lvm]# tail -f
/etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost lvm]# fuser -uv
/etc/sysconfig/network-scripts/ifcfg-eth0
USER PID ACCESS COMMAND
/etc/sysconfig/network-scripts/ifcfg-eth0:
root 3215 f.... (root)tail
再来看lsof
既然能根据文件来查打开的程序,也就该用根据程序来查打开的文件
不带参数的lsof会显示当前系统中所有打开的文件和打开的程序
要根据程序名去找的话,只需要grep就可以了
[root@localhost ~]# lsof | sed -n '1p';lsof | grep
rsyslogd
COMMAND PID USER FD TYPE DEVICE
SIZE/OFF NODE NAME
rsyslogd 1126 root cwd DIR 8,3 4096 2 /
rsyslogd 1126 root rtd DIR 8,3 4096 2 /
rsyslogd 1126 root txt REG 8,3 404168 8317 /sbin/rsyslogd
(略)
参数u,可以根据执行用户来查找打开的文件
[root@localhost ~]# lsof -u smmsp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE
NAME
sendmail
1192 smmsp cwd DIR 8,3 4096 134134 /var/spool/clientmqueue
sendmail
1192 smmsp rtd DIR 8,3 4096 2 /
sendmail
1192 smmsp txt REG 8,3 856280 16158 /usr/sbin/sendmail.sendmail
sendmail
1192 smmsp mem REG 8,3 103384 4454
/lib/libresolv-2.12.so
sendmail
1192 smmsp mem REG 8,3 35212 5880
/lib/libwrap.so.0.7.6
sendmail
1192 smmsp
mem REG 8,3 38376 4432
/lib/libcrypt-2.12.so
参数a,逻辑运算符and,代表前面的参数与后面的参数都匹配时才输出
[root@localhost ~]# lsof -u root -a -U
COMMAND PID
USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root 7u unix
0xf66b4c40 0t0 6983 socket
udevd 419 root 4u unix
0xc1454c80 0t0 7119 socket
udevd 419 root 8u unix
0xc1454a80 0t0 7141 socket
udevd 419 root 9u unix
0xf66b4440 0t0 7142 socket
lsof根据文件夹来查打开的文件
[root@localhost ~]# lsof +d /dev | grep -v
'null'
COMMAND PID
USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd
1126 root 0u unix
0xc15ac8c0 0t0 8449 /dev/log
(略)