- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業(yè)務經(jīng)營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯(lián)網(wǎng)協(xié)會理事單位
- 安全聯(lián)盟認證網(wǎng)站身份V標記
- 域名注冊服務機構許可:滇D3-20230001
- 代理域名注冊服務機構:新網(wǎng)數(shù)碼
systemctl 是用于管理 Systemd 系統(tǒng)和服務的命令行工具。Systemd 是一種系統(tǒng)初始化和管理系統(tǒng)進程的工具,被廣泛用于現(xiàn)代 Linux 系統(tǒng)。
一、Unit
Systemd 可以管理所有系統(tǒng)資源。不同的資源統(tǒng)稱為 Unit(單位),Unit 一共分成12種:
l Service unit:系統(tǒng)服務
l Target unit:多個 Unit 構成的一個組
l Device Unit:硬件設備
l Mount Unit:文件系統(tǒng)的掛載點
l Automount Unit:自動掛載點
l Path Unit:文件或路徑
l Scope Unit:不是由 Systemd 啟動的外部進程
l Slice Unit:進程組
l Snapshot Unit:Systemd 快照,可以切回某個快照
l Socket Unit:進程間通信的 socket
l Swap Unit:swap 文件
l Timer Unit:定時器
systemctl list-units命令可以查看當前系統(tǒng)的所有 Unit 。
# 列出正在運行的 Unit
$ systemctl list-units
# 列出所有Unit,包括沒有找到配置文件的或者啟動失敗的
$ systemctl list-units --all
# 列出所有沒有運行的 Unit
$ systemctl list-units --all --state=inactive
# 列出所有加載失敗的 Unit
$ systemctl list-units --failed
# 列出所有正在運行的、類型為 service 的 Unit
$ systemctl list-units --type=service
1.Unit 的狀態(tài)
# 顯示系統(tǒng)狀態(tài)
$ systemctl status
# 顯示單個 Unit 的狀態(tài)
$ sysystemctl status <service_name>
例:顯示linux服務狀態(tài):sysystemctl status linux.service
除了status命令,systemctl還提供了三個查詢狀態(tài)的簡單方法,主要供腳本內(nèi)部的判斷語句使用:
# 顯示某個 Unit 是否正在運行
$ systemctl is-active application.service
# 顯示某個 Unit 是否處于啟動失敗狀態(tài)
$ systemctl is-failed application.service
# 顯示某個 Unit 服務是否建立了啟動鏈接
$ systemctl is-enabled application.service
2. Unit 管理
對于用戶來說,最常用的是下面這些命令,用于啟動和停止 Unit(主要是 service)。
# 立即啟動一個服務
$ sudo systemctl start <service_name>
# 立即停止一個服務
$ sudo systemctl stop <service_name>
# 重啟一個服務
$ sudo systemctl restart <service_name>
# 殺死一個服務的所有子進程
$ sudo systemctl kill <service_name>
# 重新加載一個服務的配置文件
$ sudo systemctl reload <service_name>
# 重載所有修改過的配置文件
$ sudo systemctl daemon-reload
# 顯示某個 Unit 的所有底層參數(shù)
$ systemctl show <service_name>
# 顯示某個 Unit 的指定屬性的值
$ systemctl show -p CPUShares <service_name>
# 設置某個 Unit 的指定屬性
$ sudo systemctl set-property <service_name> CPUShares=500
3.依賴關系
Unit 之間存在依賴關系:A 依賴于 B,就意味著 Systemd 在啟動 A 的時候,同時會去啟動 B。
systemctl list-dependencies命令列出一個 Unit 的所有依賴。
$ systemctl list-dependencies <service_name>
上面命令的輸出結果之中,有些依賴是 Target 類型(詳見下文),默認不會展開顯示。如果要展開 Target,就需要使用--all參數(shù)。
$ systemctl list-dependencies --all <service_name>
二、Unit 的配置文件
1.配置文件的狀態(tài)
systemctl list-unit-files命令用于列出所有配置文件。
# 列出所有配置文件
$ systemctl list-unit-files
# 列出指定類型的配置文件
$ systemctl list-unit-files --type=service
這個命令會輸出一個列表。
$ systemctl list-unit-files
UNIT FILE STATE
chronyd.service enabled
clamd@.service static
clamd@scan.service disabled
這個列表顯示每個配置文件的狀態(tài),一共有四種。
l enabled:已建立啟動鏈接
l disabled:沒建立啟動鏈接
l static:該配置文件沒有[Install]部分(無法執(zhí)行),只能作為其他配置文件的依賴
l masked:該配置文件被禁止建立啟動鏈接
注意,從配置文件的狀態(tài)無法看出,該 Unit 是否正在運行。這必須執(zhí)行前面提到的systemctl status命令。
$ systemctl status <service_name>
一旦修改配置文件,就要讓 SystemD 重新加載配置文件,然后重新啟動,否則修改不會生效。
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service
2.配置文件的格式
配置文件就是普通的文本文件,可以用文本編輯器打開。
systemctl cat命令可以查看配置文件的內(nèi)容。
# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
從上面的輸出可以看到,配置文件分成幾個區(qū)塊。每個區(qū)塊的第一行,是用方括號表示的區(qū)別名,比如[Unit]。注意,配置文件的區(qū)塊名和字段名,都是大小寫敏感的。
每個區(qū)塊內(nèi)部是一些等號連接的鍵值對。
注意,鍵值對的等號兩側不能有空格.
3.配置文件的區(qū)塊
[Unit]區(qū)塊通常是配置文件的第一個區(qū)塊,用來定義 Unit 的元數(shù)據(jù),以及配置與其他 Unit 的關系。它的主要字段如下。
l Description:簡短描述
l Documentation:文檔地址
l Requires:當前 Unit 依賴的其他 Unit,如果它們沒有運行,當前 Unit 會啟動失敗
l Wants:與當前 Unit 配合的其他 Unit,如果它們沒有運行,當前 Unit 不會啟動失敗
l BindsTo:與Requires類似,它指定的 Unit 如果退出,會導致當前 Unit 停止運行
l Before:如果該字段指定的 Unit 也要啟動,那么必須在當前 Unit 之后啟動
l After:如果該字段指定的 Unit 也要啟動,那么必須在當前 Unit 之前啟動
l Conflicts:這里指定的 Unit 不能與當前 Unit 同時運行
l Condition...:當前 Unit 運行必須滿足的條件,否則不會運行
l Assert...:當前 Unit 運行必須滿足的條件,否則會報啟動失敗
[Install]通常是配置文件的最后一個區(qū)塊,用來定義如何啟動,以及是否開機啟動。
[Service]區(qū)塊用來 Service 的配置,只有 Service 類型的 Unit 才有這個區(qū)塊。它的主要字段如下。
l Type:定義啟動時的進程行為。它有以下幾種值。
l Type=simple:默認值,執(zhí)行ExecStart指定的命令,啟動主進程
l Type=forking:以 fork 方式從父進程創(chuàng)建子進程,創(chuàng)建后父進程會立即退出
l Type=oneshot:一次性進程,Systemd 會等當前服務退出,再繼續(xù)往下執(zhí)行
l Type=dbus:當前服務通過D-Bus啟動
l Type=notify:當前服務啟動完畢,會通知Systemd,再繼續(xù)往下執(zhí)行
l Type=idle:若有其他任務執(zhí)行完畢,當前服務才會運行
l ExecStart:啟動當前服務的命令
l ExecStartPre:啟動當前服務之前執(zhí)行的命令
l ExecStartPost:啟動當前服務之后執(zhí)行的命令
l ExecReload:重啟當前服務時執(zhí)行的命令
l ExecStop:停止當前服務時執(zhí)行的命令
l ExecStopPost:停止當其服務之后執(zhí)行的命令
l RestartSec:自動重啟當前服務間隔的秒數(shù)
l Restart:定義何種情況 Systemd 會自動重啟當前服務,可能的值包括always(總是重啟)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
l TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數(shù)
l Environment:指定環(huán)境變量
以Nginx為例,要將通過編譯安裝的 Nginx 服務設置為通過 systemctl 管理:
a.創(chuàng)建 Nginx 配置文件
首先,創(chuàng)建一個 Nginx 的 Systemd 服務單元配置文件。在 /etc/systemd/system/ 目錄下創(chuàng)建一個文件,例如 nginx.service。
b.編輯 Nginx 配置文件
[Unit]
Description=nginx - high performance web server
Documentation=http://www.tjdsmy.cn/en/docs/
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
請根據(jù)你的實際情況調(diào)整 ExecStart、ExecReload 和 ExecStop 的路徑,確保它們指向正確的 Nginx 可執(zhí)行文件。
c.加載新的 Systemd 單元配置:
sudo systemctl daemon-reload
d.區(qū)塊分析
[Unit]
Description=nginx - high performance web server
Documentation=http://www.tjdsmy.cn/en/docs/
After=network.target
[Unit] 部分: 在這個部分,你可以定義有關服務單元的通用信息。
l Description:服務的描述,用于簡要說明服務的用途。
l Documentation:服務的文檔鏈接,提供有關服務的更多信息。
l After:指定服務應該在哪些其他單元之后啟動。這里是 network.target,意味著 Nginx 服務將在網(wǎng)絡服務啟動后啟動。
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Service] 部分: 這是定義服務行為的主要部分。
l Type:服務的啟動類型。這里設置為 forking,表示該服務會創(chuàng)建一個子進程來運行。
l ExecStart:指定服務啟動時執(zhí)行的命令。這里是 Nginx 可執(zhí)行文件的路徑。
l ExecReload:指定重新加載服務時執(zhí)行的命令。這里是 Nginx 可執(zhí)行文件的路徑,加上 -s reload 選項以重新加載配置。
l ExecStop:指定停止服務時執(zhí)行的命令。這里是 Nginx 可執(zhí)行文件的路徑,加上 -s stop 選項以停止服務。
l PrivateTmp:為服務分配私有臨時目錄。設置為 true,以便為服務創(chuàng)建獨立的臨時文件系統(tǒng)。
[Install]
WantedBy=multi-user.target
[Install] 部分: 這里指定服務應該在哪個目標單元中啟用。
l WantedBy:指定服務應該在哪個目標單元中啟用。這里設置為 multi-user.target,表示服務應該在多用戶模式下啟用。
售前咨詢
售后咨詢
備案咨詢
二維碼
TOP