Linux systemctl 服務管理

在伺服器上,我們通常會執行許多「背景服務 (Service / Daemon)」,例如網頁伺服器 (Nginx/Apache)、資料庫 (MySQL) 或 SSH 服務。 現代 Linux 發行版(如 Ubuntu 16.04+)都使用 Systemd 來管理這些服務,而操作的指令就是 systemctl

如果要撰寫自己的 Service 設定檔,請參考下一篇:Linux Systemd Service 設定

基礎操作 (Admin)

語法:sudo systemctl [動作] [服務名稱]

nginx 為例:

1. 常用指令速查

動作指令說明
啟動start立刻啟動服務
停止stop立刻停止服務
重啟restart停止後再啟動 (PID 會變)
重載reload不中斷服務重新讀取設定 (PID 不變)
狀態status查看服務是否運作中、Log 輸出
# 最常用的組合
sudo systemctl status nginx
sudo systemctl restart nginx

2. 開機自動啟動 (Enable)

為什麼有些軟體重開機後會自己跑起來,有些不會?因為你要設定 enableenable 會在 /etc/systemd/system/multi-user.target.wants/ 建立一個符號連結 (Symbolic Link)。

  • 設定開機自啟sudo systemctl enable nginx
  • 取消開機自啟sudo systemctl disable nginx (下次開機不會跑,但現在不會停)
  • 現在啟動 + 開機自啟sudo systemctl enable --now nginx (這是個好用的參數!) sudo systemctl disable nginx
這樣下次重開機,nginx 就不會自己跑起來了(但你還是可以手動 start)。

### 徹底禁用 (Mask)
如果你真的很討厭某個服務,不希望它被任何人(包含其他依賴它的服務)啟動,可以用 `mask`。
這會把服務指向 `/dev/null`,讓它徹底失效。

```bash
# 徹底禁用服務
sudo systemctl mask nginx

# 恢復正常
sudo systemctl unmask nginx

查詢系統上的服務

如果不記得服務的完整名稱怎麼辦?或是想看看系統上到底跑了些什麼?

列出正在執行的服務

# 列出所有 loaded 且 active 的單位
systemctl list-units --type=service

列出所有安裝的服務

不管有沒有在跑,只要有安裝的都會列出來。

systemctl list-unit-files --type=service

可以搭配 grep 使用,例如 systemctl list-unit-files | grep mysql

故障排除 (Troubleshooting)

systemctl status 顯示 Failed 時,該怎麼辦?

  1. 看 Status 的後幾行:通常會顯示最後幾筆 Error Log。
  2. 使用 journalctl:查看更完整的紀錄 (請參考下一篇設定詳解)。
  3. 檢查設定檔語法:如果是 Nginx/Apache,先用它們內建的 nginx -t 檢查設定檔有沒有寫錯。
  4. 檢查 Port 佔用:是不是 Port 被搶走了?用 sudo netstat -tulpn 檢查。

總結

  • 現在想用start
  • 現在不想用stop
  • 以後開機想用enable
  • 以後開機不想用disable