经常使用命令lsof netstat 介绍

注释:在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程序在运行;因此没法卸载;

注释:进程所打开的能够是:  文件   目录     文件系统   字符设备     函数共享库   软链接    串口    硬件设备等;

相关文章
相关标签/搜索