2019独角兽企业重金招聘Python工程师标准>>>
注释:在linux下一切皆文件,包括磁盘 tty 串口,包括硬件设备,套接口;
既然linux下一切都是以文件形式存在,那我们是不是可以通过访问文件来查看数据以及网络连接以及tcp和udp等socket套接字;
系统在后台会为每个应用程序分配一个文件描述符,文件描述符为应用程序和操作系统交换提供接口,应用程序在打开文件的描述符列表提供了一些应用程序的信息;
lsof (list openfile) 列出打开文件;
注释:losf 会访问linux核心文件以及内存,所以一般需要使用root用户的权限;
losf 选项
注释:每行会显示一个打开的文件,若直接输入 losf ,不指定任何选项会显示所有进程打开的所有文件;
常用的选项如下;
lsof /filename 查看当前谁正在使用这个文件; 如: lsof /root
lsof +D /root 可以递归查看某个目录下的目录;
lsof -u username 列出某个用户打开的文件信息; losf -u root ==== losf -u 0
lsof -c program 列出某个程序所打开的文件信息; losf -c mysql ====== lsof |grep mysql
lsof -u ^mysql -c mysqld # ^mysql 表示只过滤出非mysql的程序打开的文件;
lsof -i 列出所有网络连接, 后面可以跟tcp udp :80(某个端口) 查看那个应用程序在使用80端口;
lsof -g GID 查看某个用户组所打开的文件; losf -g root ==== lsof -g 0 (查看root用户组所打开的文件);
lsof -d 4 显示文件描述符是4的进程和文件;
注释:lsof的选项都可以结合一起使用,比如 lsof -u mysql -c mysql(列出mysql用户及mysql程序打开的文件) 两者是或者的意思;
(1):lsof默认选项:如下显示;
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
进程名称 进程ID 线程ID 用户 文件描述符 类型 指定磁盘的名称 文件大小 索引阶段 打开文件的名称
[root@localhost_002 ~]# lsof |head -n10
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,3 268 64 /
systemd 1 root rtd DIR 8,3 268 64 /
systemd 1 root txt REG 8,3 1523568 279801 /usr/lib/systemd/systemd
systemd 1 root mem REG 8,3 20040 60007 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 8,3 261336 190815 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 8,3 90664 59990 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 8,3 157424 59996 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 8,3 23968 60084 /usr/lib64/libcap-ng.so.0.0.0
lsof 1704 root 2u CHR 136,0 0t0 3 /dev/pts/0
pickup 1696 postfix 7u unix 0xffff88003a44dc00 0t0 31732 socket
pickup 1696 postfix 92w FIFO 0,8 0t0 18922 pipe
注释: FD:文件描述符;
cwd(应用程序在那个目录启动的)
txt(txt类型是程序代码,应用程序本身或者共享库 如/sbin/init)
2u:表示文件描述符是2, 该文件处于读取/写入模式
w:表示只写模式;
W:表示该程序对真个应用程序可写;
type:类型;DIR(目录) REG(文件) CHR(字符) BLK(块设备) unix(域套接字) FIFO(先进先出)
(2): lsof /root 查看当前谁正在使用/root这个文件;
[root@localhost_002 ~]# lsof /root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1198 root cwd DIR 8,3 4096 33574977 /root
bash 1242 root cwd DIR 8,3 4096 33574977 /root
bash 1624 root cwd DIR 8,3 4096 33574977 /root
vim 1725 root cwd DIR 8,3 4096 33574977 /root
lsof 1744 root cwd DIR 8,3 4096 33574977 /root
lsof 1745 root cwd DIR 8,3 4096 33574977 /root
(3):lsof +D /root 可以递归查看某个目录下的目录有谁在使用;
[root@localhost_002 ~]# lsof +D /root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1198 root cwd DIR 8,3 4096 33574977 /root
bash 1242 root cwd DIR 8,3 4096 33574977 /root
bash 1624 root cwd DIR 8,3 4096 33574977 /root
vim 1725 root cwd DIR 8,3 4096 33574977 /root
vim 1725 root 4u REG 8,3 16384 37237431 /root/.2.txt.swp
lsof 1756 root cwd DIR 8,3 4096 33574977 /root
lsof 1757 root cwd DIR 8,3 4096 33574977 /root
注释:如上图例,查看到/root/.2.txt.swp的;因为我刚刚在另外一个终端编辑过这个文件;
注释:lsof可以查看到那些用户正在使用这个文件,losf后面跟 文件 目录 硬件设备 串口等( /root /dev /proc等 /tmp/mysql.sock)
(4): losf -u root 列出root用户所打开的文件信息;
[root@localhost_002 ~]# lsof -u root |head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,3 268 64 /
systemd 1 root rtd DIR 8,3 268 64 /
systemd 1 root txt REG 8,3 1523568 279801 /usr/lib/systemd/systemd
systemd 1 root mem REG 8,3 20040 60007 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 8,3 261336 190815 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 8,3 90664 59990 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 8,3 157424 59996 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 8,3 23968 60084 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 8,3 19888 60070 /usr/lib64/libattr.so.1.1.0
(5):显示某个程序所打开的文件信息; lsof -c mysql ======= lsof |grep mysql (默认lsof会显示系统里所有打开的文件)
[root@localhost_002 ~]# lsof -c mysql|head -n3
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld_sa 950 root cwd DIR 8,3 223 16788108 /usr/local/mysql
mysqld_sa 950 root rtd DIR 8,3 268 64 /
[root@localhost_002 ~]# lsof |grep mysql|head -n3
mysqld_sa 950 root cwd DIR 8,3 223 16788108 /usr/local/mysql
mysqld_sa 950 root rtd DIR 8,3 268 64 /
mysqld_sa 950 root txt REG 8,3 960472 50332813 /usr/bin/bash
注释:losf的选项可以结合一起使用,
[root@localhost_002 ~]# lsof -u mysql -c mysql |head -n3
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld_sa 950 root cwd DIR 8,3 223 16788108 /usr/local/mysql
mysqld_sa 950 root rtd DIR 8,3 268 64 /
(6):lsof -i (列出所有网络连接) lsof -i tcp lsof -i udp lsof -i :80(那个进程在使用80端口)
[root@localhost_002 ~]# lsof -i tcp|head -n3
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 888 root 3u IPv4 18131 0t0 TCP *:ssh (LISTEN)
sshd 888 root 4u IPv6 18140 0t0 TCP *:ssh (LISTEN)
[root@localhost_002 ~]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 908 root 7u IPv4 18284 0t0 TCP *:http (LISTEN)
nginx 910 nobody 7u IPv4 18284 0t0 TCP *:http (LISTEN)
nginx 911 nobody 7u IPv4 18284 0t0 TCP *:http (LISTEN)
(7):查看某个用户组所打开的文件;
[root@localhost_002 ~]# lsof -g 0 |head -n3
COMMAND PID PGID USER FD TYPE DEVICE SIZE/OFF NODE NAME
kthreadd 2 0 root cwd DIR 8,3 268 64 /
kthreadd 2 0 root rtd DIR 8,3 268 64 /
常用的命令如下:
lsof /etc/passwd #查看那些进程在使用/etc/passwd;
lsof /dev #查看有哪些进程在占用/dev/目录;
lsof -c mysql #查看mysql进程的文件使用情况;
^ 表示非的意思, lsof -c mysql -u ^mysql #mysql进程的文件使用情况,但不是mysql用户使用的;
lsof -p 2332: #查看进程PID 2332的文件使用情况;
lsof `which nginx` ==== lsof /usr/local/nginx/sbin/nginx #查看那些进程在使用nginx; `which是一个变量`
[root@localhost_002 ~]# lsof /usr/local/nginx/sbin/nginx
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 908 root txt REG 8,3 4878280 1367149 /usr/local/nginx/sbin/nginx
nginx 910 nobody txt REG 8,3 4878280 1367149 /usr/local/nginx/sbin/nginx
nginx 911 nobody txt REG 8,3 4878280 1367149 /usr/local/nginx/sbin/nginx
[root@localhost_002 ~]# lsof `which nginx`
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 908 root txt REG 8,3 4878280 1367149 /usr/local/nginx/sbin/nginx
nginx 910 nobody txt REG 8,3 4878280 1367149 /usr/local/nginx/sbin/nginx
nginx 911 nobody txt REG 8,3 4878280 1367149 /usr/local/nginx/sbin/nginx
[root@localhost_002 ~]# lsof /dev|head -n5
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 0u CHR 1,3 0t0 5999 /dev/null
systemd 1 root 1u CHR 1,3 0t0 5999 /dev/null
systemd 1 root 2u CHR 1,3 0t0 5999 /dev/null
systemd 1 root 21r CHR 10,235 0t0 7928 /dev/autofs
[root@localhost_002 ~]# lsof -c mysql |head -n4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld_sa 950 root cwd DIR 8,3 223 16788108 /usr/local/mysql
mysqld_sa 950 root rtd DIR 8,3 268 64 /
mysqld_sa 950 root txt REG 8,3 960472 50332813 /usr/bin/bash
查看mysql进程打开的文件,但是非mysql用户的;
[root@localhost_002 ~]# lsof -c mysql -u ^mysql
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld_sa 950 root cwd DIR 8,3 223 16788108 /usr/local/mysql
mysqld_sa 950 root rtd DIR 8,3 268 64 /
mysqld_sa 950 root txt REG 8,3 960472 50332813 /usr/bin/bash
mysqld_sa 950 root mem REG 8,3 62184 43553 /usr/lib64/libnss_files-2.17.so
mysqld_sa 950 root mem REG 8,3 106070960 17001962 /usr/lib/locale/locale-archive
mysqld_sa 950 root mem REG 8,3 2173512 32391 /usr/lib64/libc-2.17.so
mysqld_sa 950 root mem REG 8,3 19776 32399 /usr/lib64/libdl-2.17.so
查看进程PID 3223 打开的文件使用情况; lsof -p 3223 也尅用使用ps aux|grep -w 322
[root@localhost_002 ~]# lsof -p 3223
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
wc 3223 root cwd DIR 8,3 4096 33574977 /root
wc 3223 root rtd DIR 8,3 268 64 /
wc 3223 root txt REG 8,3 41640 50381625 /usr/bin/wc
wc 3223 root mem REG 8,3 106070960 17001962 /usr/lib/locale/locale-archive
wc 3223 root mem REG 8,3 26254 33659609 /usr/lib64/gconv/gconv-modules.cache
wc 3223 root 0u CHR 136,1 0t0 4 /dev/pts/1
程序名称 PID 启动用户 文件描述符 类型 磁盘名称 文件大小 索引节点(在磁盘的表示) 文件名称
文件描述符如下:
cwd 文件的启动在那个目录;
txt 文件的程序代码;
0 表示标准输入
1 表示输出
2 错误流
u 表示读取/写入模式, w 表示只读, R 表示只读
TYPE 类型 DIR表示目录 REG表示文件 CHR表示字符;
注释:通过lsof命令,可以查看 cwd 当前程序是在那个目录下启动, txt 程序代码, 以及它的类型(DIR目录 REG文件 CHR字符),通过lsof -p PID还可以查看进程的一些进程;同/proc/PID/下面目录下cwd目录下;
常用选项:
lsof -[ u g c D i p d ^ ]
当然,选项可以结合到一起使用,比如 -u -c lsof -u mysql -c mysql 不过两种默认是或的一起,显示出mysql用户使用文件,mysql程序使用的文件(包括root用户的);
而使用 -a 选项后,则是表示 与 的意思,不会显示root用户相关;
[root@localhost_002 ~]# lsof -a -u mysql -c mysql
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1141 mysql cwd DIR 8,3 259 34097256 /data/mysql
mysqld 1141 mysql rtd DIR 8,3 268 64 /
mysqld 1141 mysql txt REG 8,3 87240567 51165778 /usr/local/mysql/bin/mysqld
注释:lsof还可以用在卸载文件系统时,比如我们挂载cdrom到/mnt目录下,如果在该目录下还有在操作,通常会提示卸载文件系统失败:如下;
[root@localhost_002 ~]# mount /dev/cdrom /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost_002 ~]# cd /mnt
[root@localhost_002 mnt]# vim 1.txt
卸载时:
[root@localhost_002 ~]# umount /mnt
umount: /mnt:目标忙。
(有些情况下通过 lsof(8) 或 fuser(1) 可以
找到有关使用该设备的进程的有用信息)
那我们就可以通过losf /mnt 查看有哪些程序在使用/mnt目录影响卸载;
[root@localhost_002 ~]# lsof /mnt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1198 root cwd DIR 11,0 2048 1856 /mnt
vim 10050 root cwd DIR 11,0 2048 1856 /mnt
注释:图例中在看到有一个实例bash在运行,还有一个vim程序在运行;所以无法卸载;
注释:进程所打开的可以是: 文件 目录 文件系统 字符设备 函数共享库 软连接 串口 硬件设备等;