天天看點

Linux學習筆記----進階工具部分-----2,ldd檢視程式依賴庫 + lsoflddlsof

總結 + 摘錄

ldd

作用:用來檢視程式運作所需的共享庫。

示例:檢視test程式運作所依賴的庫:

/opt/app/todeav1/test$ldd test
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000039a7e00000)
libm.so.6 => /lib64/libm.so.6 (0x0000003996400000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000039a5600000)
libc.so.6 => /lib64/libc.so.6 (0x0000003995800000)
/lib64/ld-linux-x86-64.so.2 (0x0000003995400000)
      
  • 第一列:程式需要依賴什麼庫
  • 第二列: 系統提供的與程式需要的庫所對應的庫
  • 第三列:庫加載的開始位址

通過上面的資訊,我們可以得到以下幾個資訊:

  1. 通過對比第一列和第二列,我們可以分析程式需要依賴的庫和系統實際提供的,是否相比對
  2. 通過觀察第三列,我們可以知道在目前的庫中的符号在對應的程序的位址空間中的開始位置

如果依賴的某個庫找不到,通過這個指令可以迅速定位問題所在;

原理: ldd不是個可執行程式,而隻是個shell腳本; ldd顯示可執行子產品的dependency的工作原理,其實質是通過ld-linux.so(elf動态庫的裝載器)來實作的。ld-linux.so子產品會先于executable子產品程式工作,并獲得控制權,是以當上述的那些環境變量被設定時,ld-linux.so選擇了顯示可執行子產品的dependency。

lsof

lsof用來檢視目前系統檔案,包括:普通檔案、目錄、網絡檔案系統的檔案、字元或者裝置檔案、共享庫、管道、命名管道、符号連結、網絡檔案、其它。

1,指令參數

  • -a 列出打開檔案存在的程序
  • -c<程序名> 列出指定程序所打開的檔案
  • -g 列出GID号程序詳情
  • -d<檔案号> 列出占用該檔案号的程序
  • +d<目錄> 列出目錄下被打開的檔案
  • +D<目錄> 遞歸列出目錄下被打開的檔案
  • -n<目錄> 列出使用NFS的檔案
  • -i<條件> 列出符合條件的程序。(4、6、協定、:端口、 @ip )
  • -p<程序号> 列出指定程序号所打開的檔案
  • -u 列出UID号程序詳情
  • -h 顯示幫助資訊
  • -v 顯示版本資訊

2,執行個體

執行個體1:無任何參數

$lsof| more
COMMAND     PID      USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
init          1      root  cwd       DIR              253,0     4096          2 /
init          1      root  rtd       DIR              253,0     4096          2 /
init          1      root  txt       REG              253,0   150352    1310795 /sbin/init
init          1      root  mem       REG              253,0    65928    5505054 /lib64/libnss_files-2.12.so
init          1      root  mem       REG              253,0  1918016    5521405 /lib64/libc-2.12.so
init          1      root  mem       REG              253,0    93224    5521440 /lib64/libgcc_s-4.4.6-20120305.so.1
init          1      root  mem       REG              253,0    47064    5521407 /lib64/librt-2.12.so
init          1      root  mem       REG              253,0   145720    5521406 /lib64/libpthread-2.12.so
...
      

說明:

lsof輸出各列資訊的意義如下:

  • COMMAND:程序的名稱
  • PID:程序辨別符
  • PPID:父程序辨別符(需要指定-R參數)
  • USER:程序所有者
  • PGID:程序所屬組
  • FD:檔案描述符,應用程式通過檔案描述符識别該檔案。如cwd、txt等:
    (1)cwd:表示current work dirctory,即:應用程式的目前工作目錄,這是該應用程式啟動的目錄,除非它本身對這個目錄進行更改
    (2)txt :該類型的檔案是程式代碼,如應用程式二進制檔案本身或共享庫,如上清單中顯示的 /sbin/init 程式
    (3)lnn:library references (AIX);
    (4)er:FD information error (see NAME column);
    (5)jld:jail directory (FreeBSD);
    (6)ltx:shared library text (code and data);
    (7)mxx :hex memory-mapped type number xx.
    (8)m86:DOS Merge mapped file;
    (9)mem:memory-mapped file;
    (10)mmap:memory-mapped device;
    (11)pd:parent directory;
    (12)rtd:root directory;
    (13)tr:kernel trace file (OpenBSD);
    (14)v86  VP/ix mapped file;
    (15)0:表示标準輸入
    (16)1:表示标準輸出
    (17)2:表示标準錯誤
    一般在标準輸出、标準錯誤、标準輸入後還跟着檔案狀态模式:r、w、u等
    (1)u:表示該檔案被打開并處于讀取/寫入模式
    (2)r:表示該檔案被打開并處于隻讀模式
    (3)w:表示該檔案被打開并處于
    (4)空格:表示該檔案的狀态模式為unknow,且沒有鎖定
    (5)-:表示該檔案的狀态模式為unknow,且被鎖定
    同時在檔案狀态模式後面,還跟着相關的鎖
    (1)N:for a Solaris NFS lock of unknown type;
    (2)r:for read lock on part of the file;
    (3)R:for a read lock on the entire file;
    (4)w:for a write lock on part of the file;(檔案的部分寫鎖)
    (5)W:for a write lock on the entire file;(整個檔案的寫鎖)
    (6)u:for a read and write lock of any length;
    (7)U:for a lock of unknown type;
    (8)x:for an SCO OpenServer Xenix lock on part      of the file;
    (9)X:for an SCO OpenServer Xenix lock on the      entire file;
    (10)space:if there is no lock.
          
  • TYPE:檔案類型,如DIR、REG等,常見的檔案類型:
    (1)DIR:表示目錄
    (2)CHR:表示字元類型
    (3)BLK:塊裝置類型
    (4)UNIX: UNIX 域套接字
    (5)FIFO:先進先出 (FIFO) 隊列
    (6)IPv4:網際協定 (IP) 套接字
          
  • DEVICE:指定磁盤的名稱
  • SIZE:檔案的大小
  • NODE:索引節點(檔案在磁盤上的辨別)
  • NAME:打開檔案的确切名稱

執行個體2:查找某個檔案相關的程序

$lsof /bin/bash
COMMAND     PID USER  FD   TYPE DEVICE SIZE/OFF    NODE NAME
mysqld_sa  2169 root txt    REG  253,0   938736 4587562 /bin/bash
ksmtuned   2334 root txt    REG  253,0   938736 4587562 /bin/bash
bash      20121 root txt    REG  253,0   938736 4587562 /bin/bash
      

執行個體3:列出某個使用者打開的檔案資訊

$lsof -u username

-u 選項,u是user的縮寫
      

執行個體4:列出某個程式程序所打開的檔案資訊

$lsof -c mysql
      

-c 選項将會列出所有以mysql這個程序開頭的程式的檔案,其實你也可以寫成 lsof | grep mysql, 但是第一種方法明顯比第二種方法要少打幾個字元;

執行個體5:列出某個使用者以及某個程序所打開的檔案資訊

$lsof  -u test -c mysql
      

執行個體6:通過某個程序号顯示該程序打開的檔案

$lsof -p 11968
      

執行個體7:列出所有的網絡連接配接

$lsof -i
      

執行個體8:列出所有tcp 網絡連接配接資訊

$lsof -i tcp

$lsof -n -i tcp
COMMAND     PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
svnserve  11552 weber    3u  IPv4 3799399      0t0  TCP *:svn (LISTEN)
redis-ser 25501 weber    4u  IPv4  113150      0t0  TCP 127.0.0.1:6379 (LISTEN)
      

執行個體9:列出誰在使用某個端口

$lsof -i :3306
      

執行個體10:列出某個使用者的所有活躍的網絡端口

$lsof -a -u test -i
      

執行個體11:根據檔案描述列出對應的檔案資訊

$lsof -d description(like 2)
      

示例:

$lsof -d 3 | grep PARSER1
tail      6499 tde    3r   REG    253,3   4514722     417798 /opt/applog/open/log/HOSTPARSER1_ERROR_141217.log.001
      

說明: 0表示标準輸入,1表示标準輸出,2表示标準錯誤,進而可知:是以大多數應用程式所打開的檔案的 FD 都是從 3 開始

執行個體12:列出被程序号為1234的程序所打開的所有IPV4 network files

$lsof -i 4 -a -p 1234
      

執行個體13:列出目前連接配接主機nf5260i5-td上端口為:20,21,80相關的所有檔案資訊,且每隔3秒重複執行

lsof -i @nf5260i5-td:20,21,80 -r 3      

繼續閱讀