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]