单独执行lsof将输出系统中所有打开的文件
name:文件被哪些进程所打开
-p pid:进程pid所打开的所有文件
-u username:属于user进程所打开的文件
-i tcp/udp/:22 :列出网络连接
-c ssh: ssh打开的所有文件
示例:
监控打开的文件,设备
查看文件,设备被哪些进程占用
lsof /dev/tty1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
getty 4095 root 0u CHR 4,1 0t0 5834 /dev/tty1
getty 4095 root 1u CHR 4,1 0t0 5834 /dev/tty1
getty 4095 root 2u CHR 4,1 0t0 5834 /dev/tty
监控文件系统
指定目录,挂载点,可以看到有哪些进程打开了其下的文件
root@master:/proc# lsof /dev/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root 0u CHR 1,3 0t0 5820 /dev/null
init 1 root 1u CHR 1,3 0t0 5820 /dev/null
init 1 root 2u CHR 1,3 0t0 5820 /dev/null
。。。。。。
列出被指定进程名打开的文件
root@master:/proc# lsof -c ssh
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1102 root cwd DIR 8,1 4096 2 /
sshd 1102 root rtd DIR 8,1 4096 2 /
sshd 1102 root txt REG 8,1 762752 154824 /usr/sbin/sshd
sshd 1102 root mem REG 8,1 47712 397705 /lib/x86_64-linux-gnu/libnss_files-2.19.so
。。。。。。
监控进程
指定进程号,可以查看该进程打开的文件
root@master:/proc# lsof -p 1102
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1102 root cwd DIR 8,1 4096 2 /
sshd 1102 root rtd DIR 8,1 4096 2 /
sshd 1102 root txt REG 8,1 762752 154824 /usr/sbin/sshd
sshd 1102 root mem REG 8,1 47712 397705 /lib/x86_64-linux-gnu/libnss_files-2.19.so
。。。。。。
监控网络
查看指定端口有哪些进程在使用(lsof -i 列出所有的打开的网络连接)
root@master:/proc# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1102 root 3u IPv4 9660 0t0 TCP *:ssh (LISTEN)
sshd 1102 root 4u IPv6 9662 0t0 TCP *:ssh (LISTEN)
sshd 4421 root 3u IPv4 24974 0t0 TCP 172.30.51.74:ssh->172.30.51.216:53593 (ESTABLISHED)
sshd 4508 cathy 3u IPv4 24974 0t0 TCP 172.30.51.74:ssh->172.30.51.216:53593 (ESTABLISHED)
root@master:/proc# lsof -i -c ssh
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae 733 avahi 13u IPv4 8750 0t0 UDP *:mdns
avahi-dae 733 avahi 14u IPv6 8751 0t0 UDP *:mdns
。。。。。
单独执行将输出帮助页面 _
-m name: 文件被哪些进程所打开
-k name:杀死打开文件的进程
-u :在每个PID后面添加进程的所属用户
-v :显示更详细的信息
示例:
显示使用某个文件的进程信息:
$ fuser -um /dev/sda2
/dev/sda2: 6378c(quietheart) 6534c(quietheart) 6628(quietheart)
6653c(quietheart) 7429c(quietheart) 7549c(quietheart) 7608c(quietheart)
这个命令在umount的时候很有用,可以找到还有哪些用到这个设备了。
杀掉打开readme文件的程序
$fuser -m -k -i readme
这里,会在kill之前询问是否确定。最好加上-v以便知道将要杀那个进程。
查看那些程序使用tcp的80端口
$fuser -v -n tcp 80 或 $fuser -v 80/tcp
fuser不同信号的应用
用 -l参数可以列出fuser所知的信号
# fuser -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED
fuser可以发送它已知的信号给访问的指定文件进程而代替-k参数默认发送的SIGKILL,例如:只是挂起进程,那么发送HUP信号就可以了
# fuser -v /root/install.log
用户 进程号 权限 命令
/root/install.log: root 3347 f.... tail
# fuser -k -SIGHUP /root/install.log
/root/install.log: 3347
# fuser -v /root/install.log
总结:
查看某个进程打开了哪些文件
lsof -p PID
lsof -c ssh
lsof -i :22
fuser 22/tcp
查看文件被哪些进程所打开
lsof file/dev
fuser -m file/dev
fuser -v:显示更详细的信息