經常使用命令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程序在運行;因此沒法卸載;

註釋:進程所打開的能夠是:  文件   目錄     文件系統   字符設備     函數共享庫   軟鏈接    串口    硬件設備等;

相關文章
相關標籤/搜索