systemd 系統服務管理
systemd 系統服務管理
前言
傳統上的 Linux 都是靠 System V 的 init 來啟動各項系統服務,而後來新的 Systemd 出現之後,許多主流的 Linux 發行版都改用 Systemd 來管理系統服務,新的 Systemd 跟傳統 System V 的 init 相比,開機速度更快、效能更好、具有相依性檢查功能。
Systemd 的系統服務,使用 systemctl 指令管理 。
列出 Systemd 所有服務
若想要列出所有已啟動的服務,可以使用 list-units 操作指令:
- #systemctl list-units // 列出所有已啟動的服務
list-units 的輸出包含許多欄位,以下是各個欄位的說明。
- UNIT :Systemd 服務單位(unit)名稱。
- LOAD :該服務單位設定檔是否有被 Systemd 載入至記憶體中。
- ACTIVE :是否已經正常啟動。
- SUB :更詳細的狀態說明,值會因為不同服務有所不同。
- DESCRIPTION :關於此服務的簡單說明。
- #systemctl //# 列出所有已啟動的服務
- #systemctl list-units --all
- systemctl list-units --all --state=inactive //#列出系統上所有未啟動的服務
- systemctl list-units --type=service //只列出系統上所有 service 類型的服務
Systemd 基本服務管理
在 Systemd 中每一個系統服務就稱為一個服務單位(unit),而服務單位又可以區分為 service、socket、target、path、snapshot、timer 等多種不同的類型(type),我們可以從設定檔的附檔名來判斷該服務單位所屬的類型,最常見的就是以 .service 結尾的系統服務,大部分的伺服器都是屬於這種。
如果要管理 Systemd 中的各種服務,可以使用 systemctl 這個指令,配合各種操作指令來進行各種操作。
systemctl [操作指令] [服務名稱.service]
若要啟動系統服務,可以使用 start 操作指令,例如啟動 Nginx 網頁伺服器:
- #systemctl start nginx.service //啟動 nginx 網頁伺服器服務
若要顯示指定的系統服務狀態,可以使用 status 操作指令:
- systemctl status nginx.service //顯示 nginx 服務狀態
若要停止指定的系統服務狀態,可以使用 stop 操作指令:
- #systemctl stop nginx.service //停止 nginx 服務
當我們在指定服務名稱時,可以將結尾的 .service 省略,這樣可以少打一些字,例如:
- #systemctl start nginx //啟動 nginx 網頁伺服器服務
- #systemctl status nginx //顯示 nginx 服務狀態
- #systemctl stop nginx //停止 nginx 服務
啟用、停用開機自動啟動服務
systemctl 的 start 與 stop 兩個操作指令是用來控制目前服務的狀態,如果想要設定開機自動啟動服務的話,就要改用 enable 與 disable:
- #systemctl enable nginx //設定開機自動啟動 nginx 網頁伺服器
- #systemctl disable nginx //取消開機自動啟動 nginx 網頁伺服器
檢測系統服務狀態
以下是一些用來檢測系統服務狀態的操作指令:
- #systemctl is-active nginx.service //檢查 nginx 服務是否正在運行
- #systemctl is-enabled nginx.service //檢查 nginx 服務是否有設定開機自動啟動
- #systemctl is-failed nginx.service //檢查 nginx 服務是否啟動失敗
這幾個指令在撰寫系統管理的 shell script 指令稿時會很好用,以下是一個範例:
# 判斷服務狀態的 Bash 指令稿
IS_ACT=`systemctl is-active nginx.service`
if [ "$IS_ACT" == "active" ]; then
echo "Nginx is active."
else
echo "Nginx is not active."
fi
服務內部設定與狀態
如果想要查看指定服務的 Systemd 設定檔內容,可以用 cat 操作指令將設定檔印出來:
- #systemctl cat atd.service //查看服務內部設定檔
Systemd 會自動處理服務的相依性問題,如果想要查看特定服務的相依服務,可以使用 list-dependencies 操作指令:
- #systemctl list-dependencies sshd.service //# 查看特定服務的相依服務
若想要查看特定服務的底層設定值,可以使用 show 操作指令:
- #systemctl show sshd.service //# 查看特定服務的底層設定值
- #systemctl show sshd.service -p MainPID // 查看特定服務的特定設定值
遮蔽特定服務
在某些情況下我們可能會希望停用某項服務,避免它被手動或自動啟動,這時候就可以利用 mask 操作指令,將特定的服務遮蔽起來:
- #systemctl mask nginx.service //遮蔽特定服務
服務被遮蔽之後,就會無法啟動:
- #systemctl start nginx.service //嘗試啟動被遮蔽的服務
- #systemctl unmask nginx.service //恢復被遮蔽的服務
編輯服務設定
如果想要更改某些服務的設定,可以使用 edit 操作指令:
- #systemctl edit nginx.service //編輯服務設定
執行這行指令之後,會開啟一個空白的檔案,讓管理者將新的設定值寫在裡面,存檔離開後,Systemd 會在 /etc/systemd/system/ 目錄之下,建立一個服務名稱加上 .d 的子目錄(以這個例子來說就是 nginx.service.d),然後將新增的設定寫在這個子目錄下的 override.conf 中,之後 Systemd 在載入服務設定檔時,就會自動優先採用此處的設定。
如果想要直接編輯完整的設定檔,可以加上 --full 參數:
- #systemctl edit --full nginx.service //編輯服務設定(顯示完整設定內容)
這樣的修改方式就會直接把完整的設定寫入 /etc/systemd/system/ 目錄底下,而 Systemd 會優先採用此處的設定值。
如果想要移除先前用 edit 修改的設定,只要直接刪除對應的 .d 目錄即可:
- #rm -r /etc/systemd/system/nginx.service.d //刪除自己修改的設定
如果是以 --full 模式修改的話,就要刪除對應的設定檔,然後重新載入 Systemd:
- #rm /etc/systemd/system/nginx.service //刪除自己修改的設定(full 模式)
- #systemctl daemon-reload //重新載入 Systemd
參考資料
特色、摘要,Feature、Summary:
關鍵字、標籤,Keyword、Tag:
- Ubuntu,Linux,System,

留言
張貼留言
Aron阿龍,謝謝您的留言互動!