如何擷取linux進程的執行檔案路徑

來源:互聯網
上載者:User

http://blog.csdn.net/jccz_zys/archive/2006/12/11/1438215.aspx

 

 

我發現的擷取linux進程的執行檔案路徑的方法有如下2個:
    1、在c++代碼裡面通過函數gecpwd擷取進程當前執行檔案路徑,通過日誌或
       控制台來顯示當前進程的運行路徑。這估計是大家看到這個標題就想到的
       方法。
    2、直接通過shell來查看,這也是我在實際情況中碰到的情況:
           就是我們開發的系統,控制了在同一個路徑下只能夠運行一次,在實際部署
       環境過程中會在不同的路徑下提供不同的tcp連接埠號碼給不同的應用來測試聯調,
       這樣,在以./cmd的形式運行多個程式後,會出現通過ps查看進程時,看到n多
       的./cmd的同名進程在運行。一旦那個應用出現問題或者時間久了後,需要尋找
       對應目錄時,不能夠迅速定位那個進程是運行在那個具體的位置以及為誰服務。
       具體做法就是:
           1、以超級使用者登陸
           2、進入/proc目錄
           3、ps查看所有符合./cmd的進程,找出其對應的進程號
           4、用ll命令: ll 進程號
              如下顯示一個樣本:
              [root@Cluster1 proc]# ll 22401
       total 0
       -r--r--r--    1 zhouys    zhouys     0 Dec 11 11:10 cmdline
       -r--r--r--    1 zhouys    zhouys     0 Dec 11 11:10 cpu
       lrwxrwxrwx    1 zhouys    zhouys     0 Dec 11 11:10 cwd -> /home/zhouys/sbs/bin
       -r--------    1 zhouys    zhouys     0 Dec 11 11:10 environ
       lrwxrwxrwx    1 zhouys    zhouys     0 Dec 11 11:10 exe -> /home/zhouys/sbs/bin/cbs (deleted)
       dr-x------    2 zhouys    zhouys     0 Dec 11 11:10 fd
       -r--------    1 zhouys    zhouys     0 Dec 11 11:10 maps
       -rw-------    1 zhouys    zhouys     0 Dec 11 11:10 mem
       -r--r--r--    1 zhouys    zhouys     0 Dec 11 11:10 mounts
       lrwxrwxrwx    1 zhouys    zhouys     0 Dec 11 11:10 root -> /
       -r--r--r--    1 zhouys    zhouys     0 Dec 11 11:10 stat
       -r--r--r--    1 zhouys    zhouys     0 Dec 11 11:10 statm
       -r--r--r--    1 zhouys    zhouys     0 Dec 11 11:10 status
              /proc檔案系統下的 進程號目錄 下面的檔案鏡像了進程的當前運行資訊,
              從中可以看到:
               cwd符號連結的就是進程22401的運行目錄;
               exe符號串連就是執行程式的絕對路徑;
               cmdline就是程式運行時輸入的命令列命令;本例為:./cbs
               cpu記錄了進程可能運行在其上的cpu;顯示虛擬cpu資訊
               environ記錄了進程運行時的環境變數
               fd目錄下是進程開啟或使用的檔案的符號串連
               ...
                   
        通過cwd直接進入進程運行目錄,通過查看相關資訊就可以定位此目錄對應那個連接埠號碼,以及
    定位是那個應用才使用此服務程式。         

 

 

如何查看某個連接埠是由那個進程或命令所開啟的?

 

http://www.ajaxstu.com/Linuxwangluozhishi/115075.html

 

 

Redhat AS 4.4  i386
發現我機器開啟了一個80連接埠
用[code]
netstat -nltp |grep 80
lsof -i:80
fuser -n tcp 80
[/code]
都看不出事哪個命令或進程開的,最後根據經驗發現是TUX開的。Tux是核心進程。
偶的問題是,有什麼命令能發現這個核心進程,而不需要憑經驗。

[[i] 本帖最後由 maluyao 於 2007-6-13 20:59 編輯 [/i]]

deng_save_file第一點:要注意普通使用者不能查看其他使用者的進程名稱。也就是你要用 root 來看。
第二點:nlp 不夠,你就用: avpn
完整的命令:
( for tcp port )
netstat  -avpn   2>&1    |  grep ^tcp  |grep 80
( for udp port )
netstat  -avpn   2>&1    |  grep ^udp  |grep 80

 

ssffzz1netstat -nlp 難道不可以嗎?
[root@kl ~]# netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 192.168.0.254:21            0.0.0.0:*                   LISTEN      1180/vsftpd         
tcp        0      0 192.168.0.254:53            0.0.0.0:*                   LISTEN      1142/named         
tcp        0      0 192.168.0.254:22            0.0.0.0:*                   LISTEN      1161/sshd           
tcp        0      0 192.168.50.254:3128         0.0.0.0:*                   LISTEN      1211/(squid)        
tcp        0      0 192.168.0.254:3128          0.0.0.0:*                   LISTEN      1211/(squid)        
tcp        0      0 127.0.0.1:953               0.0.0.0:*                   LISTEN      1142/named         
udp        0      0 0.0.0.0:2048                0.0.0.0:*                               1142/named         
udp        0      0 0.0.0.0:2049                0.0.0.0:*                               1211/(squid)        
udp        0      0 192.168.0.254:53            0.0.0.0:*                               1142/named         
udp        0      0 0.0.0.0:3130                0.0.0.0:*                               1211/(squid)        
udp        0      0 0.0.0.0:67                  0.0.0.0:*                               1189/dhcpd         
udp        0      0 192.168.50.254:69           0.0.0.0:*                               1170/xinetd         
raw        0      0 0.0.0.0:1                   0.0.0.0:*                   7           1189/dhcpd         
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  2      [ ACC ]     STREAM     LISTENING     1436473 25899/0             /tmp/ssh-XGAJo25899/agent.25899
[root@kl ~]#

 

maluyao我那個80是tcp連接埠,所以nlp和nltp沒啥區別,
進程那一欄就顯示一個減號"-"

你可以執行以下service tux start 試試看。

[quote]原帖由 [i]ssffzz1[/i] 於 2007-6-13 20:05 發表於 2樓  
netstat -nlp 難道不可以嗎?
# netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   ... [/quote]

 

ssffzz1哦,這樣啊。
這個軟體我沒用過。不過有一種技術好像是用常規的方法是看不到監聽介面的。就是軟體監聽原始套介面,然後過濾出屬於自己的資料包。這樣是看不到監聽口的。不過應該和你說的不同,這個用netstat -nlp是什麼也看不到的,譬如抓包軟體。

 

lihnlsof 命令可以。。。。

 

maluyao很遺憾,avnp參數也不行,結果如下
[code]
[root@test1 maintain]# netstat -avnpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2867/portmap
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      -
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      3111/vsftpd
[/code]
我加了個"t"參數,代表tcp的意思。

[quote]原帖由 [i]deng_save_file[/i] 於 2007-6-13 20:11 發表於 3樓  
第一點:要注意普通使用者不能查看其他使用者的進程名稱。也就是你要用 root 來看。
第二點:nlp 不夠,你就用: avpn
完整的命令:
( for tcp port )
netstat  -avpn   2>&1    |  grep ^tcp  |grep 80 ... [/quote]

[[i] 本帖最後由 maluyao 於 2007-6-14 11:08 編輯 [/i]]

 

qpfei$沒有辦法,pstree看有沒有tux,就是憑經驗

 

wysillyfuser -n tcp 80 沒有返回嗎?

看來可以把機子扔了,還要它幹嘛.

 

qsxingnetstat -tuanp 呢

 

mxbaolsof貌似很強大,應該能返回來的

 

qpfei$netstat lsof fuser 是通過標準的系統調用擷取資訊的,tux作為核心態http server ,看得到看不到關聯都是正常的。反正看到80口被佔用就ps看看,靠經驗也沒什麼不好的

個人而言不喜歡搞在核心態的東西,寧願用使用者態的apache+squid

 

maluyao[quote]原帖由 [i]qpfei$[/i] 於 2007-6-14 15:19 發表於 12樓  
netstat lsof fuser 是通過標準的系統調用擷取資訊的,tux作為核心態http server ,看得到看不到關聯都是正常的。反正看到80口被佔用就ps看看,靠經驗也沒什麼不好的

個人而言不喜歡搞在核心態的東西,寧願用 ... [/quote]
偶也不喜歡,是別人無意中開啟的。

 

aaronyou素我愚昧。請問 什麼叫核心態 ,使用者態?
難道是指安裝系統預先裝的apache 為核心態? 自己編譯的為使用者態? 覺得也不象,請指教。謝謝

 

maluyao[quote]原帖由 [i]aaronyou[/i] 於 2007-6-14 22:28 發表於 14樓  
素我愚昧。請問 什麼叫核心態 ,使用者態?
難道是指安裝系統預先裝的apache 為核心態? 自己編譯的為使用者態? 覺得也不象,請指教。謝謝 [/quote]

Tux 是基於核心的httpd伺服器,很少人用,我這裡也是被別人誤開啟的。

 

jiemin0228老師也有你不會的~!!!!哈哈
那就用你告訴我們的命令試試唄~~~
     lsof  或 lsof  -i   
  呵呵   別生氣阿
哈哈   老師哦~~嘻嘻 !!1
哦耶~~!

 

aaronyou謝謝 樓主。
[url]http://linuxdby.com/html/linux/beginner/20070505/26391.html[/url]
有較詳細的資料,和我一樣有疑問的,可以參考一下。

 

maluyao沒有最佳答案,論壇又不準自摸,偶準備胡亂選一個當最佳了。

 

frankzh[quote]原帖由 [i]maluyao[/i] 於 2007-6-13 16:47 發表於 1樓  
Redhat AS 4.4  i386
發現我機器開啟了一個80連接埠

netstat -nltp |grep 80
lsof -i:80
fuser -n tcp 80

都看不出事哪個命令或進程開的,最後根據經驗發現是TUX開的。Tux是核心進程。
偶的問題是,有 ... [/quote]

可以這樣測試
[code]
[root@server1 ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to resin.example.com (127.0.0.1).
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.1 200 OK
Content-Type: text/html
Date: Thu, 28 Jun 2007 03:47:39 GMT
Server: TUX/2.0 (Linux)
Content-Length: 25
ETag: "25-egcnlhim"
Accept-Ranges: bytes
Last-Modified: Tue, 24 Apr 2007 07:53:48 GMT

frank hello ok ok 070426
Connection closed by foreign host.

[/code]

看到了嗎? 這行  Server: TUX/2.0 (Linux)

[[i] 本帖最後由 frankzh 於 2007-6-29 12:05 編輯 [/i]]

 

maluyao這就又回到”經驗“的問題了,如果telnet過去,什麼反應都沒有,不是還不知道嗎? 這次是tux,下次也許是Zux Aux呢

[quote]原帖由 [i]frankzh[/i] 於 2007-6-29 12:03 發表於 19樓  

可以這樣測試

# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to resin.example.com (127.0.0.1).
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.1 200 OK
Content-Type: text/ht ... [/quote]

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.