1. 程式人生 > >mac檢視埠被佔用情況

mac檢視埠被佔用情況

sudo /usr/local/bin/openresty
nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)

但是,通過命令:sudo netstat -n|grep 80 以及 ps -A|grep nginx 都找不到是哪個程式佔用了80埠。

後續探索的過程:
1、lsof -P -itcp:80
-P是顯示埠號,而不是程式名. -i 後面跟"協議@server:port"
找不到。
2、sudo lsof -P -itcp:80 ,結果如下:
COMMAND    PID       USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
httpd       82       root    4u  IPv6 0x3ef15ffdc5dd853f      0t0  TCP *:80 (LISTEN)
httpd      268       _www    4u  IPv6 0x3ef15ffdc5dd853f      0t0  TCP *:80 (LISTEN)
SogouServ  368 xushengbin   20u  IPv4 0x3ef15ffdcda6971f      0t0  TCP 10.10.2.251:50215->180.149.156.142:80 (ESTABLISHED)
SogouServ  368 xushengbin   23u  IPv4 0x3ef15ffdcda6971f      0t0  TCP 10.10.2.251:50215->180.149.156.142:80 (ESTABLISHED)
httpd      658       _www    4u  IPv6 0x3ef15ffdc5dd853f      0t0  TCP *:80 (LISTEN)
httpd      659       _www    4u  IPv6 0x3ef15ffdc5dd853f      0t0  TCP *:80 (LISTEN)
httpd      660       _www    4u  IPv6 0x3ef15ffdc5dd853f      0t0  TCP *:80 (LISTEN)
httpd      662       _www    4u  IPv6 0x3ef15ffdc5dd853f      0t0  TCP *:80 (LISTEN)
httpd      663       _www    4u  IPv6 0x3ef15ffdc5dd853f      0t0  TCP *:80 (LISTEN)
httpd      664       _www    4u  IPv6 0x3ef15ffdc5dd853f      0t0  TCP *:80 (LISTEN)

找到了。是mac自帶的apache程式,自動啟動了。
3、也可以通過pstree,顯示所有的程序:
|-+= 00082 root /usr/sbin/httpd -D FOREGROUND
 | |--- 00268 _www /usr/sbin/httpd -D FOREGROUND
 | |--- 00658 _www /usr/sbin/httpd -D FOREGROUND
 | |--- 00659 _www /usr/sbin/httpd -D FOREGROUND
 | |--- 00660 _www /usr/sbin/httpd -D FOREGROUND
 | |--- 00662 _www /usr/sbin/httpd -D FOREGROUND
 | |--- 00663 _www /usr/sbin/httpd -D FOREGROUND
 | \--- 00664 _www /usr/sbin/httpd -D FOREGROUND

總結:
1、現在也不明白,為啥"sudo netstat -n|grep 80" 搜不到80埠對應的程序。
2、lsof,加上sudo,才能顯示所有使用者開啟的檔案。
3、ps -A|grep nginx, 佔用80埠的程式不叫nginx,而是apache,所以搜不到
4、安裝完nginx,涉及到另外一個問題,怎樣把brew install安裝的程式,開機啟動:
目前瞭解到的有launchctl 和homebrew services兩種方式:
下面是官方對homebrew services的介紹:
Integrates Homebrew formulae with MacOS X's launchctl manager.

說明homebrew services是對launchctl的整合。那麼最好就用homebrew services來控制mac下軟體的開機啟動。

具體命令如下:
比如我想把openresty開機啟動:
執行命令 brew info openresty
輸出結果:
To have launchd start homebrew/nginx/openresty now and restart at login:
brew services start homebrew/nginx/openresty
接下來執行brew services start homebrew/nginx/openresty
應該就把openresty加入開機啟動項了。
可通過brew services list 檢視所有的開機啟動項(這裡麵包括了通過launchctl load新增的開機啟動項),輸出結果如下:
memcached started xushengbin /Users/xushengbin/Library/LaunchAgents/homebrew.mxcl.memcached.plist
mysql     stopped
openresty started xushengbin /Users/xushengbin/Library/LaunchAgents/homebrew.mxcl.openresty.plist
php53     stopped
php56     stopped
php70     started xushengbin /Users/xushengbin/Library/LaunchAgents/homebrew.mxcl.php70.plist
redis     started xushengbin /Users/xushengbin/Library/LaunchAgents/homebrew.mxcl.redis.plist                  

關機,重新啟動,發動openresty並沒有自動啟動。想一想,應該是openresty佔用80埠,必須是root賬號啟動,當前登入賬號無法啟動,因此,改為
sudo brew services start homebrew/nginx/openresty
就可以了。
brew services start 和sudo brew services start 區別在於:
前者是start service at login後者是start service at boot

另外,如果想要清楚無效的開機啟動項,可以用命令:
brew services cleanup

上面的brew services



附launchctl用法:

執行 launchctl list 顯示當前的啟動指令碼。
sudo launchctl unload [path/to/script] 停止正在執行的啟動指令碼,再加上 -w 選項即可去除開機啟動。