簡單介紹 ss 指令
ss (socket statistics) 指令是一個實用的命令行工具,可以用來顯示主機上的 socket 相關資訊
什麼是 Socket?
在計算機網路中,socket 是一種抽象概念,用於描述一個可以通訊的端點。 通常情況下,一個 socket 是由一個 IP 地址和一個端口號組成的,它可以用於在不同的進程之間進行通訊,包括在同一臺主機上的不同進程之間
Socket 通常用於實現網路協議,例如 TCP(傳輸控制協議)和 UDP(使用者資料包協議),這些協議可以在網路中的不同主機之間進行可靠的數據傳輸
by ChatGPT
ss 主要可以用來替代 netstat 指令,雖然 netstat 預設還是會安裝在許多 linux 的發行版本中,但以現今來說,netstat 指令已經有些過時了,推薦使用 ss 與 ip 指令作為替代
使用方式
ss 指令提供多種參數可以使用,以下是可使用的參數
-h,--help: 詳細顯示工具訊息-V,--version: 顯示工具版本-4,--ipv4: 只顯示 IPv4 的連線狀態-6,--ipv6: 只顯示 IPv6 的連線狀態-t,--tcp: 只顯示 TCP 協議連線狀態-u,--udp: 只顯示 UDP 協議連線狀態-x,--unix: 只顯示 Unix 的連線狀態-l,--listen: 顯示正在監聽的連線狀態-p,--processes: 顯示與連線相關的進程 ID 和進程名稱-n,--numeric: 以數字形式顯示網路地址和連接狀態,而非主機名稱和服務名稱-a,--all: 列出指定協議所有監聽與非監聽的連線-r,--resolve: 把 IP 顯示為域名,port 顯示為協議名稱-e,--extended: 顯示連線的詳細資訊
如果今天想要看主機上有開啟 TCP port 的服務,我們可以使用下面這行指令
Linux 上使用 -p 參數需要使用 sudo
sudo ss -ltnp
顯示結果
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=692,fd=3))
LISTEN 0 4096 0.0.0.0:443 0.0.0.0:* users:(("docker-proxy",pid=436759,fd=4))
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=4528,fd=14))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=692,fd=4))
LISTEN 0 4096 [::]:443 [::]:* users:(("docker-proxy",pid=436766,fd=4))
使用 ss 指令處理 Nginx 無法啟動的 Bug
某次重啟機器之後,發現 nginx 無法啟動
首先用 tail 指令查看一下 nginx 的 error log
# 查看檔案末 100 行的內容
tail -n 100 /var/log/nginx/error.log
log 顯示 80 port 已經被使用了,導致 nginx 無法啟動
2023/03/03 03:30:25 [emerg] 2764#2764: bind() to 0.0.0.0:80 failed (98: Unknown error)
2023/03/03 03:30:25 [emerg] 2764#2764: bind() to [::]:80 failed (98: Unknown error)
2023/03/03 03:30:25 [emerg] 2764#2764: still could not bind()
用 ss 查看誰正在使用 80 port
sudo ss -tulpn
顯示結果發現 80 port 正在被 apache2 使用中
我們可以使用 sudo systemctl list-unit-files 查看哪些服務預設是被開機啟用的狀態
知道誰是罪魁禍首之後,就把服務給關閉吧
sudo systemctl stop apache2
sudo systemctl disable apache2
重新啟動 nginx,發現 nginx 可以正常工作了
sudo nginx -t # 檢查 nginx 設定檔案有沒有錯誤
sudo systemctl restart nginx