簡單介紹 ss 指令

ss (socket statistics) 指令是一個實用的命令行工具,可以用來顯示主機上的 socket 相關資訊

什麼是 Socket?

在計算機網路中,socket 是一種抽象概念,用於描述一個可以通訊的端點。 通常情況下,一個 socket 是由一個 IP 地址和一個端口號組成的,它可以用於在不同的進程之間進行通訊,包括在同一臺主機上的不同進程之間

Socket 通常用於實現網路協議,例如 TCP(傳輸控制協議)和 UDP(使用者資料包協議),這些協議可以在網路中的不同主機之間進行可靠的數據傳輸

by ChatGPT

ss 主要可以用來替代 netstat 指令,雖然 netstat 預設還是會安裝在許多 linux 的發行版本中,但以現今來說,netstat 指令已經有些過時了,推薦使用 ssip 指令作為替代

使用方式

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

參考資料


This site uses Just the Docs, a documentation theme for Jekyll.