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)
為什麼有些軟體重開機後會自己跑起來,有些不會?因為你要設定 enable。
enable 會在 /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 時,該怎麼辦?
- 看 Status 的後幾行:通常會顯示最後幾筆 Error Log。
- 使用 journalctl:查看更完整的紀錄 (請參考下一篇設定詳解)。
- 檢查設定檔語法:如果是 Nginx/Apache,先用它們內建的
nginx -t檢查設定檔有沒有寫錯。 - 檢查 Port 佔用:是不是 Port 被搶走了?用
sudo netstat -tulpn檢查。
總結
- 現在想用:
start - 現在不想用:
stop - 以後開機想用:
enable - 以後開機不想用:
disable