linux下檢視埠占用的程式

wangzh3發表於2012-06-27

在linux下開發時,你的軟體可能要使用某一個埠,或者想查詢某一個埠是否被佔用。需要怎麼做呢??這的確是一個比較煩惱的問題,我也此為這個苦惱過。但是透過查詢man手冊,還是同事的交流。總結出來兩種方法:

1)使用lsof命令

lsof是一個非常強大的linux工具,她被用來查詢哪些程式使用了那些檔案。在linux系統下,基本上所有的東西都可以被當作檔案來用。socket當然也是一種檔案了。所以lsof可以用來查詢誰用了某一個埠。具體方法:

lsof -i :port_number |grep "(LISTEN)"

-i是用來查詢和網路相關的檔案,":"號是必須的,它是標誌你查詢的是一個埠。port_number就是你要查詢的埠號,譬如你要查詢是否 有程式佔用了oracle的監聽埠1521,就可以使用lsof -i :1521 |grep "(LISTEN)"。如果有程式已經佔用了,那麼下面列印的第二個欄位就是該程式的程式id,第一個欄位是程式的名字。

如果只有losf -i :port_number可能會查到很多應用程式,但這些程式實際並沒有佔用你指定的埠,這些埠只是連線到本機器或者別的機器的該埠。所以要grep "(LISTEN)“,因為一個埠只可能被一個程式佔用的,所以這種方法是可靠的。

2)使用netstat 命令

大家一定對這個命令比較熟悉了,可能你從沒有想到用到來查詢哪一個程式的佔用了指定的埠。但是netstat -an 的確提供了這種功能。所以有問題了一定要想到先去查詢man手冊,不過說實話,某些man手冊寫得讓中國人看不懂,那沒有辦法了,就googe或者 baidu一下吧。

執行man netstat命令,你會發現netstat 提供了'-p'的選項,這個選項的功能是告訴你哪個程式佔用了該埠,但是她提供的形式比較古怪是以pid/process_name提供的。pid當然 是程式id了,process_name是程式的命令,中間以'/'號分隔。

和上面的原因一樣,我們只查詢listen的埠,netstat 給我們提供了-l的選項,這個選項不是預設的選項。

下面以1521埠來看怎麼查詢到該程式,我們使用下面的命令:

netstat -lnp|awk 'BEGIN{prt=":1521$"}{if ($4 ~ prt) print $0}'

在這裡使用awk來匹配第4個欄位的模式是為了避免誤判。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/47869/viewspace-1058653/,如需轉載,請註明出處,否則將追究法律責任。

相關文章