注释:在linux下一切皆文件,包括磁盘 tty 串口,包括硬件设备,套接口;mysql
既然linux下一切都是以文件形式存在,那咱们是否是能够经过访问文件来查看数据以及网络链接以及tcp和udp等socket套接字;linux
系统在后台会为每一个应用程序分配一个文件描述符,文件描述符为应用程序和操做系统交换提供接口,应用程序在打开文件的描述符列表提供了一些应用程序的信息;nginx
lsof (list openfile) 列出打开文件; sql
注释:losf 会访问linux核心文件以及内存,因此通常须要使用root用户的权限;apache
losf 选项vim
注释:每行会显示一个打开的文件,若直接输入 losf ,不指定任何选项会显示全部进程打开的全部文件;bash
经常使用的选项以下;网络
lsof /filename 查看当前谁正在使用这个文件; 如: lsof /rootssh
lsof +D /root 能够递归查看某个目录下的目录;socket
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程序在运行;因此没法卸载;
注释:进程所打开的能够是: 文件 目录 文件系统 字符设备 函数共享库 软链接 串口 硬件设备等;