lsof,就是"ls open file"的意思,是一个显示文件打开句柄的工具,下面汇总一些常用的命令
展示系统中所有
直接执行lsof,就是现实系统中所有打开句柄
# lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 124704 917562 /sbin/init
init 1 root 0u CHR 1,3 0t0 4369 /dev/null
init 1 root 1u CHR 1,3 0t0 4369 /dev/null
init 1 root 2u CHR 1,3 0t0 4369 /dev/null
init 1 root 3r FIFO 0,8 0t0 6323 pipe
展示title中的字段解释
- COMMAND
调用命令 - PID
process ID - USER
用户 - FD
file description
cwd – Current Working Directory 当前位置
txt – Text file 文本文件
mem – Memory mapped file 内存映射文件
mmap – Memory mapped device 内存映射设备
NUMBER – r for read, w for write, u for read and write. 权限数字表示 - TYPE
REG – Regular File 普通文件
DIR – Directory 文件夹
FIFO – First In First Out 先入先出文件(一般为管道文件)
CHR – Character special file 字符串文件
查看文件被那些进程使用
# lsof /var/log/syslog
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog
显示文件夹下所有占用文件的句柄信息
# lsof +D /var/log/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog
rsyslogd 488 syslog 2w REG 8,1 2405 269616 /var/log/auth.log
console-k 144 root 9w REG 8,1 10871 269369 /var/log/ConsoleKit/history
显示某个程序执行的句柄
通过-c 指定, 它是字符串前缀匹配
# lsof -c ssh -c init
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root txt REG 8,1 124704 917562 /sbin/init
init 1 root mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so
init 1 root mem REG 8,1 30684 1442694 /lib/i386-linux-gnu/librt-2.13.so
...
ssh-agent 1528 lakshmanan 1u CHR 1,3 0t0 4369 /dev/null
ssh-agent 1528 lakshmanan 2u CHR 1,3 0t0 4369 /dev/null
ssh-agent 1528 lakshmanan 3u unix 0xdf70e240 0t0 10464 /tmp/ssh-sUymKXxw1495/agent.1495
查看mount文件或者文件夹被谁占用
# lsof +D /mnt/glusterFS/cache/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
test 29757 root 84u REG 0,331 122880 13547194176911157464 /mnt/glusterFS/cache/365701222416481548_767717188491542528.mp3
查看某个用户打开的句柄
# lsof -u lakshmanan
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
update-no 1892 lakshmanan 20r FIFO 0,8 0t0 14536 pipe
update-no 1892 lakshmanan 21w FIFO 0,8 0t0 14536 pipe
bash 1995 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan
如果你希望列出所有但是排除用户lakshmanan,可以这样
# lsof -u ^lakshmanan
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rtkit-dae 1380 rtkit 7u 0000 0,9 0 4360 anon_inode
udisks-da 1584 root cwd DIR 8,1 4096 2 /
如果想找到某个用户下使用的进程ID信息,可以执行
lsof -t -u lakshmanan
配合kill可以执行按用户杀进程
kill -9 `lsof -t -u lakshmanan
查看某个进程的句柄
# lsof -p 1753
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1753 lakshmanan cwd DIR 8,1 4096 393571 /home/lakshmanan/test.txt
bash 1753 lakshmanan rtd DIR 8,1 4096 2 /
bash 1753 lakshmanan 255u CHR 136,0 0t0 3 /dev/pts/0
...
按AND组合条件
如果将不同的命令条件组合使用,这里默认是OR的关系,如
# lsof -u lakshmanan -c init
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 124704 917562 /sbin/init
bash 1995 lakshmanan 2u CHR 136,2 0t0 5 /dev/pts/2
bash 1995 lakshmanan 255u CHR 136,2 0t0 5 /dev/pts/2
...
如果要实现AND的组合,需要添加-a,如lsof -u lakshmanan -c init -a
repeat模式
有点类似ping的方式,通过-r参数来让命令重复执行
如lsof -u lakshmanan -c init -a -r5
r后面的数字表示间隔秒数
特别注意的是,可以使用==+r== 表示直到没有结果返回结束
显示所有网络连接
# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae 515 avahi 13u IPv4 6848 0t0 UDP *:mdns
avahi-dae 515 avahi 16u IPv6 6851 0t0 UDP *:52060
cupsd 1075 root 5u IPv6 22512 0t0 TCP ip6-localhost:ipp (LISTEN)
可以指定-i4或者-i6单独来看IPv4或者IPv6
可以指定tcp/udp来单独看,如lsof -i tcp; lsof -i udp;
查看指定端口的占用情况
# lsof -i :25
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
exim4 2541 Debian-exim 3u IPv4 8677 TCP localhost:smtp (LISTEN)