systemctl 服務管理:完整的 systemd 操作指南
在現代 Linux 發行版中,systemd 已經取代了傳統的 SysVinit 成為主要的初始化系統與服務管理器。對於系統管理員而言,掌握 systemctl 指令是日常維護的核心技能。這篇文章將深入解析 systemctl 的常用操作,並提供在 Ubuntu 22.04 和 Debian 12 上可直接執行的範例,幫助你快速上手。
檢視服務狀態與資訊
管理服務的第一步是了解其當前狀態。systemctl status 是最常用的指令,它不僅顯示服務是否運行(active),還會輸出最近的日誌片段,有助於即時除錯。
# 檢視 sshd 服務的詳細狀態
sudo systemctl status sshd
# 輸出範例
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-10-23 10:00:00 UTC; 2h ago
Main PID: 1234 (sshd)
Tasks: 1 (limit: 4915)
Memory: 2.1M
CPU: 15ms
CGroup: /system.slice/ssh.service
└─1234 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
若只需簡短狀態,可使用 is-active 搭配 echo $? 判斷,適合用於腳本自動化檢查:
systemctl is-active sshd
# 若回傳 "active" 則回傳值為 0,否則為非 0
啟動、停止與重新載入配置
當你需要變更服務的運行狀態時,可以使用 start、stop 和 restart。值得注意的是,修改了服務配置文件(如 /etc/systemd/system/ 下的 .service 檔案)後,必須執行 daemon-reload 讓 systemd 重新讀取配置,否則變更不會生效。
# 1. 重新載入所有服務配置文件
sudo systemctl daemon-reload
# 2. 停止 nginx 服務
sudo systemctl stop nginx
# 3. 重新啟動 nginx 以套用新配置
sudo systemctl restart nginx
對於網路服務,有時僅需重新讀取配置而不中斷連線,此時可使用 reload:
# 僅重新讀取配置,不中斷現有連線
sudo systemctl reload nginx
設定開機自動啟動
確保關鍵服務在系統重啟後自動運行是系統管理的重點。enable 和 disable 指令用於控制服務的開機啟動狀態,這通常透過建立符號連結(symlink)到 /etc/systemd/system/ 來實現。
# 啟用 nginx 開機自動啟動
sudo systemctl enable nginx
# 禁用 nginx 開機自動啟動
sudo systemctl disable nginx
# 確認是否已啟用
systemctl is-enabled nginx
# 輸出範例:enabled
管理服務群組與掛載點
systemctl 不僅能管理服務,還能管理 mount 點、socket 連接器等。你可以使用 list-units 來篩選特定類型的單元。
# 列出所有正在運行的服務
systemctl list-units --type=service --state=active
# 列出所有已掛載的文件系統
systemctl list-units --type=mount
# 檢視特定 mount 點的狀態
systemctl status mnt-data.disk
此外,systemctl cat 可以顯示服務的完整配置文件內容,對於理解服務依賴關係極有幫助:
# 顯示 nginx.service 的完整配置內容
systemctl cat nginx.service
常見問題與除錯
1. 服務狀態顯示 "inactive (dead)" 但無法啟動?
這通常是由於配置文件語法錯誤或依賴服務未啟動所致。請使用 journalctl 檢視詳細錯誤訊息:
# 檢視最近 50 行的系統日誌,過濾 nginx 相關錯誤
sudo journalctl -u nginx -n 50 --no-pager
2. 如何防止服務開機自動啟動?
除了使用 disable,有時需要同時禁用並停止服務,確保當前也處於停止狀態:
sudo systemctl disable --now nginx
# 此指令等同於同時執行 disable 和 stop
小結
systemctl 是 systemd 生態系統的核心指令,透過熟練掌握 status、enable、daemon-reload 等指令,你能高效地管理 Linux 系統的各種服務。建議在生產環境中操作前,先於測試環境驗證配置變更,並善用 journalctl 進行日誌分析,以確保系統穩定運行。