在使用Linux系統的過程中,有時候會遇到端口被占用而導致服務無法啟動的情況。比如HTTP使用80端口,但當啟動Apache時,卻發現此端口正在使用。
這種情況大多數是由於軟件沖突、或者默認端口設置不正確導致的,此時需要查看究竟哪個進程占用了端口,來決定進一步的處理方法。
1.查看端口占用情況的命令:lsof -i
root@ubuntuServer0:/home/shang/bin# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 892 root 3u IPv4 13149 0t0 TCP *:ssh (LISTEN) sshd 892 root 4u IPv6 13151 0t0 TCP *:ssh (LISTEN) postgres 1070 postgres 3u IPv6 11215 0t0 TCP localhost:postgresql (LISTEN) postgres 1070 postgres 6u IPv4 11216 0t0 TCP localhost:postgresql (LISTEN) postgres 1070 postgres 10u IPv6 11224 0t0 UDP localhost:49869->localhost:49869 postgres 1127 postgres 10u IPv6 11224 0t0 UDP localhost:49869->localhost:49869 memcached 1171 memcache 26u IPv4 14401 0t0 TCP localhost:11211 (LISTEN) memcached 1171 memcache 27u IPv4 14402 0t0 UDP localhost:11211 rsync 1183 root 4u IPv4 14403 0t0 TCP localhost:rsync (LISTEN) sshd 8583 root 3u IPv4 20140 0t0 TCP 192.168.131.150:ssh->192.168.131.1:58475 (ESTABLISHED) sshd 8632 shang 3u IPv4 20140 0t0 TCP 192.168.131.150:ssh->192.168.131.1:58475 (ESTABLISHED) swift-con 8801 root 4u IPv4 24806 0t0 TCP *:6011 (LISTEN) swift-con 8802 root 4u IPv4 24799 0t0 TCP *:6021 (LISTEN) swift-con 8803 root 4u IPv4 24790 0t0 TCP *:6031 (LISTEN)
這里返回了Linux當前所有打開端口的占用情況。第一段是進程,最后一列是偵聽的協議、偵聽的IP與端口號、狀態。如果端口號是已知的常用服務(如80、21等),則會直接顯示協議名稱,如http、ftp、ssh等。
2.查看某一端口的占用情況: lsof -i:端口號
root@ubuntuServer0:/home/shang/bin# lsof -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME swift-pro 9082 root 4u IPv4 25363 0t0 TCP *:http-alt (LISTEN) swift-pro 9085 root 4u IPv4 25363 0t0 TCP *:http-alt (LISTEN) swift-pro 9086 root 4u IPv4 25363 0t0 TCP *:http-alt (LISTEN)
3.結束占用端口的進程:killall 進程名
參考網址:
http://my.oschina.net/u/193184/blog/146885
