一、lsof
lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。每行顯示一個打開的文件,若不指定條件默認將顯示所有進程打開的所有文件。lsof輸出各列信息的意義如下:
#COMMAND:進程的名稱
#PID:進程標識符
#USER:進程所有者
#FD:文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等
#TYPE:文件類型,如DIR、REG等
#DEVICE:指定磁盤的名稱
#SIZE:文件的大小
#NODE:索引節點(文件在磁盤上的標識)
#NAME:打開文件的確切名稱
lsof常用參數
lsof abc.txt 顯示開啟文件abc.txt的進程 lsof -c abc 顯示abc進程現在打開的文件 lsof -c -p 1234 列出進程號為1234的進程所打開的文件 lsof -g gid 顯示歸屬gid的進程情況 lsof +d /usr/local/ 顯示目錄下被進程開啟的文件 lsof +D /usr/local/ 同上,但是會搜索目錄下的目錄,時間較長 lsof -d 4 顯示使用fd為4的進程
1.1 字段說明
其中FD 列中的文件描述符
cwd 值表示應用程序的當前工作目錄,這是該應用程序啟動的目錄,除非它本身對這個目錄進行更改。
txt 類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序。其次數值表示應用程序的文件描述符,這是打開該文件時返回的一個整數。如上的最后一行文件/dev/initctl,其文件描述符為10。
u 表示該文件被打開並處於讀取/寫入模式,而不是只讀 ® 或只寫 (w) 模式。同時還有大寫 的W 表示該應用程序具有對整個文件的寫鎖。該文件描述符用於確保每次只能打開一個應用程序實例。初始打開每個應用程序時,都具有三個文件描述符,從 0 到 2,分別表示標准輸入、輸出和錯誤流。所以大多數應用程序所打開的文件的 FD 都是從 3 開始。與 FD 列相比,
Type 列則比較直觀。
文件和目錄分別稱為 REG 和 DIR。而CHR 和 BLK,分別表示字符和塊設備;或者 UNIX、FIFO 和 IPv4,分別表示 UNIX 域套接字、先進先出 (FIFO) 隊列和網際協議 (IP) 套接字。
lsof 常見的用法是查找應用程序打開的文件的名稱和數目。可用於查找出某個特定應用程序將日志數據記錄到何處,或者正在跟蹤某個問題。
例如,linux限制了進程能夠打開文件的數目。通常這個數值很大,所以不會產生問題,並且在需要時,應用程序可以請求更大的值(直到某個上限)。
如果你懷疑應用程序耗盡了文件描述符,那么可以使用 lsof 統計打開的文件數目,以進行驗證。
lsof |wc -l
1.2 常用例子說明
1)查找指定端口號的進程信息
-i //顯示所有打開的端口 [ztao@MongoDB ~]$ lsof -i:6379 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME redis-ser 5341 ztao 4u IPv6 23457 0t0 TCP *:6379 (LISTEN) redis-ser 5341 ztao 5u IPv4 23459 0t0 TCP *:6379 (LISTEN) redis-ser 5341 ztao 6u IPv4 23533 0t0 TCP localhost:6379->localhost:6633 (ESTABLISHED) redis-ser 5341 ztao 7u IPv4 23535 0t0 TCP localhost:6379->localhost:6634 (ESTABLISHED) redis-ser 5341 ztao 8u IPv4 23538 0t0 TCP localhost:6379->localhost:6635 (ESTABLISHED) redis-ser 5341 ztao 9u IPv4 23540 0t0 TCP localhost:6379->localhost:6636 (ESTABLISHED) redis-ser 5341 ztao 10u IPv4 23839 0t0 TCP localhost:6379->localhost:6747 (ESTABLISHED) redis-ser 5341 ztao 11u IPv4 23842 0t0 TCP localhost:6379->localhost:6748 (ESTABLISHED) newsProvi 5349 ztao 6u IPv4 23530 0t0 TCP localhost:6633->localhost:6379 (ESTABLISHED) newsProvi 5349 ztao 7u IPv4 23532 0t0 TCP localhost:6634->localhost:6379 (ESTABLISHED) newsProvi 5349 ztao 8u IPv4 23536 0t0 TCP localhost:6635->localhost:6379 (ESTABLISHED) newsProvi 5349 ztao 9u IPv4 23539 0t0 TCP localhost:6636->localhost:6379 (ESTABLISHED) newsDistr 5456 ztao 12u IPv4 23838 0t0 TCP localhost:6747->localhost:6379 (ESTABLISHED) newsDistr 5456 ztao 13u IPv4 23841 0t0 TCP localhost:6748->localhost:6379 (ESTABLISHED)
2. 列出某個程序所打開的文件信息
lsof -c mysql
備注: -c 選項將會列出所有以mysql開頭的程序的文件,
其實你也可以寫成 lsof | grep mysql, 但是第一種方法明顯比第二種方法要少打幾個字符了
3. 通過某個進程號顯示該進行打開的文件
lsof -p 1972
4.查找誰在使用某個文件
可以查看 在使用某個目錄的的程序的相關信息
這里可以看到 smbd(samba服務)在使用 /home/james目錄
[root@centos1 src]# lsof /home/james/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
smbd 1972 root cwd DIR 253,2 4096 2093057 /home/james
smbd 1975 root cwd DIR 253,2 4096 2093057 /home/james
nmbd 1981 root cwd DIR 253,2 4096 2093057 /home/james
smbd 6191 root cwd DIR 253,2 4096 2093057 /home/james
5、列出某個用戶打開的所有文件
[root@centos1 src]# lsof -u james
二、 IPCS
pcs是一個uinx/linux的命令。用於報告系統的消息隊列、信號量、共享內存等
ipcs -a 是默認的輸出信息 打印出當前系統中所有的進程間通信方式的信息
ipcs -m 打印出使用共享內存進行進程間通信的信息
ipcs -q 打印出使用消息隊列進行進程間通信的信息
ipcs -s 打印出使用信號進行進程間通信的信息
三、ldd查看動態庫依賴
[ztteng@ztteng boost]$ ldd thread linux-gate.so.1 => (0x00151000) libboost_thread.so.1.55.0 => /usr/local/lib/libboost_thread.so.1.55.0 (0x009fe000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00cd7000) libm.so.6 => /lib/libm.so.6 (0x007d3000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00cb1000) libc.so.6 => /lib/libc.so.6 (0x0061d000) libboost_system.so.1.55.0 => /usr/local/lib/libboost_system.so.1.55.0 (0x00b0c000) libpthread.so.0 => /lib/libpthread.so.0 (0x007b6000) librt.so.1 => /lib/librt.so.1 (0x00814000) /lib/ld-linux.so.2 (0x005f7000)