註釋:在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程序在運行;因此沒法卸載;
註釋:進程所打開的能夠是: 文件 目錄 文件系統 字符設備 函數共享庫 軟鏈接 串口 硬件設備等;