(翻譯)如何使用systemctl命令來管理systemd的服務(wù)(Service)和資源(單元)
介紹
Systemd 是一個系統(tǒng)初始化和系統(tǒng)管理工具,作為linux機(jī)器的新標(biāo)準(zhǔn)正被廣泛的接受甩骏。雖然 systemd 相比于正被其替代的傳統(tǒng)的 SysV 初始系統(tǒng)是否有改進(jìn)仍有一些值得考慮的細(xì)節(jié),但在主要的版本中準(zhǔn)備采納或已經(jīng)采納它了。
由于其被廣泛采納缀拭,熟悉 systemd 是物有所值的脐区,它會使得管理服務(wù)非常簡單有决。學(xué)習(xí)和掌握組成systemd的工具和守護(hù)進(jìn)程,將會有助你領(lǐng)會其提供的強(qiáng)力谋旦、靈活等能力,至少可以幫助你以最少的麻煩處理工作。
在本指南中勘究,我們將討論systemctl命令愕撰,該命令是來控制初始化系統(tǒng)的核心管理工具刹衫。我們將包含如何管理服務(wù)醋寝、檢查狀態(tài)、改變系統(tǒng)狀態(tài)和使用配置文件带迟。
請注意雖然systemd已經(jīng)成為大多數(shù)linux版本中的初始系統(tǒng)音羞,它并沒有在所有的發(fā)行版中掛載。如果你在跟隨本教程仓犬,在你的終端中輸出 bash: systemctl is not installed
那表示你的機(jī)器中安裝了不同的初始化系統(tǒng)嗅绰。
服務(wù)管理
一個初始化系統(tǒng)的基本目的是在啟動某些必須在Linux核心啟動后啟動的模塊(傳統(tǒng)上稱其為用戶模塊)。該初始化系統(tǒng)也被用來在系統(tǒng)正在運(yùn)行時的任何時間點(diǎn)來管理服務(wù)和用于服務(wù)的守護(hù)進(jìn)程婶肩。留心這一點(diǎn)办陷,我們將開始一些簡單的服務(wù)管理操作
在Systemd中,大部分操作的對象是單元(units)律歼,一些Systemd知道如何去管理的資源民镜。單元按照其代表的資源類型進(jìn)行歸類,由作為單元文件被熟知的文件定義险毁。每個單元的類型可以通過文件的后綴名推斷出來制圈。
對于服務(wù)管理任務(wù),目標(biāo)單元將會是服務(wù)單元集畔况,它含有.service后綴名的單元文件鲸鹦。然而,對于大多數(shù)服務(wù)管理命令跷跪,可以省略.service后綴馋嗜,因?yàn)?strong>systemd在你使用服務(wù)管理命令的時候巧妙的知道你想操作一個服務(wù)文件。
啟動和暫停服務(wù)
要啟動一個Systemd服務(wù)吵瞻,使用start命令葛菇,來執(zhí)行服務(wù)的單元文件中的執(zhí)行集。如果當(dāng)前用戶非根用戶橡羞,需要使用sudo執(zhí)行眯停,因?yàn)橐獔?zhí)行的命令將對整個系統(tǒng)產(chǎn)生影響:
sudo systemctl start application.service
就像我們上面提到的,systemd知道去尋找.service文件來進(jìn)行服務(wù)管理命令卿泽,所以該命令可以簡單的這樣輸入:
sudo sytemctl start application
雖然你可以使用上述格式來完成一般的操作莺债,但為了清晰起見,我們將使用.service后綴來提醒命令明確的執(zhí)行我們要操作的目標(biāo)文件签夭。
要停止當(dāng)前運(yùn)行的服務(wù)齐邦,可以用stop命令來替換:
sudo systemctl stop application.service
重啟和重新加載
要重啟當(dāng)前運(yùn)行的服務(wù),可以用restart命令來替換:
sudo systemctl restart application.service
如果討論中的應(yīng)用可以重載他的配置文件(不用重啟)第租,你可以調(diào)用reload命令來初始化進(jìn)程:
sudo systemctl reload application.service
如果你不能確定當(dāng)前服務(wù)是否重載其配置的功能侄旬,你可以調(diào)用reload-or-restart命令 這將會在可以重載的情況下重載配置,否則煌妈,會重啟服務(wù)使新配置被使用:
sudo systemctl reload-orrestart application.service
打開和關(guān)閉服務(wù)的開機(jī)啟動
上述命令在當(dāng)前會話中啟動或停止命令是很有用。但是告知系統(tǒng)開機(jī)啟動程序,你必須執(zhí)行開機(jī)啟動璧诵。
要執(zhí)行開啟汰蜘,使用enable命令
sudo systemctl enable application.service
這將創(chuàng)建一個從系統(tǒng)的拷貝的服務(wù)文件(通常在/lib/systemd/system 或 /etc/systemd/system)指向用來給systemd程序?qū)ふ易詣訂游募谋镜赜脖P(一般是/etc/systemd/system/some_target.target.wants 我們將在本教程后續(xù)中介紹)符號鏈接
關(guān)閉該服務(wù)的開機(jī)自啟,你可以鍵入:
sudo systemctl disable application.service
這將會刪除說明該程序是開機(jī)啟動的符號鏈接之宿。
記住打開開機(jī)自啟并不會在當(dāng)前會話中啟動服務(wù)族操,如果你既希望啟動服務(wù)也想打開開機(jī)自啟,你將必須start和enable命令調(diào)用比被。
檢查服務(wù)的狀態(tài) #####:
要檢查系統(tǒng)中服務(wù)的狀態(tài)色难,可以使用status命令:
systemctl status application.service
這將提供服務(wù)的狀態(tài),cgroup的結(jié)構(gòu)等缀,和少量的最開始的日志行枷莉。
舉個例子,當(dāng)你檢查Ngix服務(wù)的狀態(tài)時尺迂,你將看到這樣的輸入結(jié)果:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2015-01-27 19:41:23 EST; 22h ago
Main PID: 495 (nginx)
CGroup: /system.slice/nginx.service
├─495 nginx: master process /usr/bin/nginx -g pid /run/nginx.pid; error_log stderr;
└─496 nginx: worker process
Jan 27 19:41:23 desktop systemd[1]: Starting A high performance web server and a reverse proxy server...
Jan 27 19:41:23 desktop systemd[1]: Started A high performance web server and a reverse proxy server.
這為你提供當(dāng)前服務(wù)很好的狀態(tài)查看笤妙,通知你任何問題還有某個需要執(zhí)行的動作。
也有別的檢查特定狀態(tài)的方法噪裕,例如蹲盘,檢查一個單元是否正在運(yùn)行,可以使用** is-active ** 命令:
systemctl is-active application.service
這將返回當(dāng)前單元的狀態(tài)膳音,通常是active 或 ** inactive**,這段代碼執(zhí)行的結(jié)果召衔,如果是運(yùn)行狀態(tài)將會是“0”,可以在程序上更容易使用祭陷。(一般linux程序成功后會返回0)
查看該單元是否是開機(jī)自啟苍凛,可以使用is-enalbed命令
systemctl is-enabled application.service
這將輸出該服務(wù)是否開機(jī)自啟,同樣的返回結(jié)果為“0”或"1"根據(jù)其自身的狀態(tài)颗胡。
另外一個檢查是查看該單元是否是在一個錯誤的狀態(tài)毫深,這指示了討論中的單元在啟動時是否有問題:
systemctl is-failed application.service
如果正常運(yùn)行返回active,如果有錯誤返回failed毒姨。如果該單元被顯式的停止哑蔫,將會返回unknown 或 inactive。返回狀態(tài)碼”0“表示有失敗發(fā)生而返回狀態(tài)碼“1”表示別的狀態(tài)弧呐。
系統(tǒng)狀態(tài)查看
到現(xiàn)在介紹的命令對于控制單個服務(wù)很有用闸迷,但是對于探查系統(tǒng)當(dāng)前狀態(tài)用處不大。有很多的systemctl命令來提供該信息俘枫。
列舉當(dāng)前單元
要查看當(dāng)前systemd知道的所有的活動的單元列表腥沽,我們可以使用list-units命令:
systemctl list-units
這將會展示系統(tǒng)中systemd激活的所有的單元列表。輸出會類似于這樣:
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running ATD daemon
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
dbus.service loaded active running D-Bus System Message Bus
dcron.service loaded active running Periodic Command Scheduler
dkms.service loaded active exited Dynamic Kernel Modules System
getty@tty1.service loaded active running Getty on tty1
. . .
輸出中包含如下幾列:
- UNIT: systemd的單元名稱
- LOAD: 單元的配置是否被systemd解析鸠蚪,加載過的單元的配置保存在內(nèi)存中
- ACTIVE: 一個簡要關(guān)于單元是否激活的狀態(tài)信息今阳,通常是相當(dāng)基本的告知該單元是否成功的啟動
- SUB:這是低等級狀態(tài)標(biāo)識了該單元的更多的細(xì)節(jié)信息师溅。這通常會根據(jù)單元類型,狀態(tài)和單元運(yùn)行的真是真實(shí)方法變化盾舌。
- DESCIPTION: 一個簡短的單元功能的文字描述
因?yàn)?strong>list-units命令默認(rèn)只展示激活的單元墓臭,上面所有的條目中的LOAD列都顯示“l(fā)oaded”和ACTIVE列都顯示“active”,這些信息就是不帶額外參數(shù)systemctl的默認(rèn)展示行為妖谴,所以如果你不帶參數(shù)的調(diào)用systemctl命令窿锉,你將看到同樣的輸出結(jié)果:
systemctl
我們可以通過添加額外的標(biāo)志參數(shù)告知systemctl輸出不同的信息。列如膝舅,查看systemd中所有加載的(或試圖加載)嗡载,不論是否被激活的單元,你可以使用-all參數(shù)仍稀,像這樣:
systemctl list-units --all
這將會輸出systemd加載的或試圖去加載的單元洼滚,不考慮他們當(dāng)前在系統(tǒng)中的狀態(tài)。其中琳轿,一些單元在運(yùn)行后變?yōu)榉羌せ顮顟B(tài)判沟,一些systemd試圖去加載的但是在硬盤中找不到的單元。
你可以使用別的參數(shù)來過濾這些結(jié)果崭篡。例如挪哄,我們可以使用--state參數(shù)來標(biāo)識LOAD、ACTIVE琉闪,或SUB狀態(tài)中我們想要查看的迹炼。同時你需要保留--all參數(shù)來告知systemctl允許非激活狀態(tài)的單元展示。
systemctl list-units --all --state=inactive
另外一個常用的過濾參數(shù)--type=.我們可以告知systenctl來展示我們感興趣的類型的單元颠毙。例如斯入,只查看激活的服務(wù)的單元,我們可以使用
systemctl list-units --type=service
列舉所有單元文件
list-units命令只展示哪些systemd試圖解析和加載進(jìn)內(nèi)存的單元蛀蜜。因?yàn)?strong>systemd只會讀取它認(rèn)為他將需要的單元刻两,這將不一定包含系統(tǒng)中所有可用的單元。要查看在systemd目錄中每個可用的單元文件滴某,包含哪些systemd沒有試圖加載的磅摹。你可以使用list-unit-files命令替代:
systemctl list-unit-files
單元是systemd知道的資源的集合。因?yàn)?strong>systemd不一定需要讀取所有的定義信息霎奢,它只展示文件本身的基本信息户誓。輸出結(jié)果有兩列: 單元文件名和狀態(tài)
UNIT FILE STATE
proc-sys-fs-binfmt_misc.automount static
dev-hugepages.mount static
dev-mqueue.mount static
proc-fs-nfsd.mount static
proc-sys-fs-binfmt_misc.mount static
sys-fs-fuse-connections.mount static
sys-kernel-config.mount static
sys-kernel-debug.mount static
tmp.mount static
var-lib-nfs-rpc_pipefs.mount static
org.cups.cupsd.path enabled
. . .
狀態(tài)列通常為“enabled”,"disabled",“static”幕侠,“masked”帝美。在該語境下,靜態(tài)表示該單元文件沒有包含那些用來打開單元開機(jī)自啟功能的安裝部分代碼晤硕,因此這些單元不能夠開機(jī)自啟悼潭。通常庇忌,這意味著扮演者一次性執(zhí)行動作或僅被用來其他單元的依賴不能夠單獨(dú)運(yùn)行的。
我們將在涉及到時展開“masked”的解釋女责。
單元管理
目前為止漆枚,我們已經(jīng)實(shí)踐了服務(wù)相關(guān)和展示systemd知道的單元和單元文件的信息。我們可以使用一些其他的命令來查找找出更多的特定信息抵知。
展示一個單元文件
要展示一個被systemd加載進(jìn)其系統(tǒng)的單元文件,你可以使用cat命令软族。例如刷喜,查看atd計(jì)劃守護(hù)進(jìn)程,我們可以鍵入:
systemctl cat atd.service
[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target
輸出的結(jié)果是被當(dāng)前運(yùn)行的systemd進(jìn)程所知道的單元文件內(nèi)容立砸,如果你最近修改了單元文件內(nèi)容或正在重寫一個單元文件片段的內(nèi)容掖疮,知道這點(diǎn)很重要。(我們在后續(xù)會涉及到)
展示依賴
查看一個單元的依賴樹颗祝,你可以使用list-dependencied命令:
systemctl list-dependencies sshd.service
這將展示一個分層的那些為了開啟討論中單元時必須處理的依賴關(guān)系圖浊闪。這些依賴,在當(dāng)前語境下螺戳,包括那些直接被程序需要以及啟動這些程序的上一級的依賴程序搁宾。
sshd.service
├─system.slice
└─basic.target
├─microcode.service
├─rhel-autorelabel-mark.service
├─rhel-autorelabel.service
├─rhel-configure.service
├─rhel-dmesg.service
├─rhel-loadmodules.service
├─paths.target
├─slices.target
. . .
遞歸的依賴只展示到.target單元,這些單元用來指示系統(tǒng)的狀態(tài)倔幼。若要遞歸展示所有的依賴盖腿,加入--all參數(shù)。
展示反轉(zhuǎn)的依賴(給定的單元被別的單元依賴)损同,你可以添加--reverse參數(shù)翩腐,其他常用的參數(shù)--before和--after,可以用來分別展示在特定單元之前或之后運(yùn)行的單元膏燃。
檢查單元的屬性
若要查看低一級的單元屬性茂卦,你可以使用show命令。這將用key==value(鍵值對)形式列舉出該單元的屬性:
systemctl show sshd.service
Id=sshd.service
Names=sshd.service
Requires=basic.target
Wants=system.slice
WantedBy=multi-user.target
Conflicts=shutdown.target
Before=shutdown.target multi-user.target
After=syslog.target network.target auditd.service systemd-journald.socket basic.target system.slice
Description=OpenSSH server daemon
. . .
如果你想展示某個特定的屬性组哩,你可以使用-p參數(shù)并附帶屬性名稱等龙。例如,查看sshd.service單元的conflicts屬性,你可以鍵入:
systemctl show sshd.service -p Conflicts
Conflicts=shutdown.target
標(biāo)記和不標(biāo)記單元
我們已經(jīng)在服務(wù)管理部分知道如何去停止和關(guān)閉開機(jī)啟動服務(wù)禁炒,但是systemd也有把單元標(biāo)記為不論自動或手動都不可啟動的能力而咆,這是通過將該單元鏈接到/dev/null實(shí)現(xiàn)的。這被稱為標(biāo)記單元幕袱,可以用個mask命令來實(shí)現(xiàn):
sudo systemctl mask nginx.service
這將阻止nginx服務(wù)被自動或手動啟動暴备,只要在其被標(biāo)記的狀態(tài)下。
如果你查看list-unit-files们豌,你將會看到該服務(wù)已經(jīng)被標(biāo)記為“masked”狀態(tài)展示:
systemctl list-unit-files
. . .
kmod-static-nodes.service static
ldconfig.service static
mandb.service static
messagebus.service static
nginx.service masked
quotaon.service static
rc-local.service static
rdisc.service disabled
rescue.service static
. . .
如果你試圖啟動該服務(wù)涯捻,你將看到如下信息:
sudo systemctl start nginx.service
Failed to start nginx.service: Unit nginx.service is masked.
若要解鎖一個單元的標(biāo)記機(jī)浅妆,讓其可以被使用,簡單的使用unmask即可:
sudo systemctl unmask nginx.service
這將是該單元返回到其被標(biāo)記前的狀態(tài)障癌,被允許啟動或開機(jī)自啟凌外。
編輯單元文件內(nèi)容
關(guān)于單元文件的格式的討論不在本教程范圍內(nèi),如果你需要調(diào)整單元文件的內(nèi)容可以使用systemctl提供了內(nèi)置的修改或編輯單元文件的命令來完成涛浙。
edit命令默認(rèn)會打開當(dāng)前的單元文件片段:
sudo systemctl edit nginx.service
這將打開一個空白的文件康辑,該文件可以用來覆蓋或添加單元中定義的指令。同時在/etc/systemd/system路徑下轿亮,一個文件夾將會被創(chuàng)建疮薇,文件名是單元文件名附加。d.例如我注,對于nginx.service來說按咒,一個名為nginx.service.d的文件夾將會被創(chuàng)建。
在該文件夾內(nèi)但骨,名為override.conf的片段文件將會被創(chuàng)建励七。當(dāng)單元被加載過,systemd將會在內(nèi)存中將該重寫片段和初始的單元文件合并起來奔缠。該片段中的指令的優(yōu)先級高于初始單元文件中相應(yīng)的指令掠抬。
如果你想要編輯完成的單元文件而不是單元文件片段,你可以輸入--full參數(shù):
sudo systemctl edit --full nginx.service
這將會將當(dāng)前的單元文件加載到編輯器添坊,在那里可以被修改剿另。當(dāng)編輯器退出時,修改后的文件將會被存儲到/etc/systemd/system贬蛙,該文件將會被以比系統(tǒng)的單元定義(通常在**/lib/systemd/system)高的優(yōu)先級被使用雨女。
如要刪除任意的你創(chuàng)建的附加的或者單元的.d配置文件夾或者在/etc/systemd/system路徑下的修改的文件。例如阳准,刪除片段氛堕,我們可以鍵入:
sudo rm -r /etc/systemd/system/nginx.service.d
若要刪除一個完整修改的單元文件,你將鍵入:
sudo rm /etc/systemd/system/nginx.service
在刪除這些文件或文件夾后野蝇,你需要重載systemd進(jìn)程讼稚,這樣它就不會再引用這些文件,讓它回溯使用原來系統(tǒng)給定文件绕沈。你可以通過鍵入如下信息來完成:
sudo systemctl daemon-reload
通過目標(biāo)(Targets)調(diào)整系統(tǒng)狀態(tài)(運(yùn)行等級)
目標(biāo)是一些特殊的單元文件锐想,可以來描述系統(tǒng)狀態(tài)或同步點(diǎn)。像其他的單元乍狐,定義目標(biāo)的文件也可以通過后綴名被認(rèn)出赠摇,對于目標(biāo)文件來說是.target。目標(biāo)本身不做很多功能,代之的是被用來整合其他的單元藕帜。
這點(diǎn)可以用來使系統(tǒng)變成特定的狀態(tài)烫罩,跟別的初始化系統(tǒng)中使用運(yùn)行級別(runlevel)很相似。它們被用來當(dāng)作某個特定功能可用時的索引洽故,可以讓你直接指明想要的狀態(tài)而不是通過一些需要的單獨(dú)的單元來完成狀態(tài)修改贝攒。
例如,有個swap.target文件是用來標(biāo)識交換(swap)功能可用的时甚。那些是該進(jìn)程的組成部分的需要目標(biāo)文件同步加載單元隘弊,在其配置中以WantedBy=或RequiredBy=那個swap.target標(biāo)識。而那些需要swap文件可用的單元文件在配置中可以使用Wants=撞秋,××Requires=,和After=××指令來說明他們之間的關(guān)系长捧。
獲取和設(shè)置默認(rèn)的目標(biāo)
systemd進(jìn)程當(dāng)啟動系統(tǒng)時會使用默認(rèn)的目標(biāo)。完成那個目標(biāo)文件的級聯(lián)的依賴將會是系統(tǒng)進(jìn)入所需的狀態(tài)吻贿。若要查看系統(tǒng)中默認(rèn)的目標(biāo),鍵入:
systemctl get-dafault
multi-user.target
如果你想要設(shè)置一個不同的默認(rèn)目標(biāo)哑子,你可以使用set-default舅列。例如,你如果有個圖形桌面安裝目標(biāo)卧蜓,你希望系統(tǒng)將其作為默認(rèn)的目標(biāo)加載帐要,你可以相應(yīng)的改變系統(tǒng)默認(rèn)的目標(biāo):
sydo systemctl set-default graphical.target
列舉可用的目標(biāo)
你可以查看在系統(tǒng)中可用的目標(biāo)列表,鍵入:
systemctl list-unit-files --type=target
不像運(yùn)行級別弥奸,目標(biāo)一次可以啟動多個榨惠。一個激活的目標(biāo)示意systemd重新試圖啟動所有跟該目標(biāo)相關(guān)的單元并且沒有試圖將這些單元停止。要查看所有的活動目標(biāo)盛霎,鍵入:
systemctl list-units --type=target
隔離目標(biāo)
啟動一個目標(biāo)中涉及的所有的單元赠橙,并且停止所有不再依賴樹上的單元是可以的。想達(dá)到該目的的命令被稱為愤炸,isolate期揪。這類似去其他初始化系統(tǒng)中的改變運(yùn)行級別。
例如规个,你正在通過graphical.target激活來操作一個圖形化系統(tǒng)凤薛,你可以使用隔離multi-user.target來關(guān)閉圖形系統(tǒng)讓系統(tǒng)進(jìn)入多用戶命令行狀態(tài)。由于graphical.target依賴于multi-user.target但不包括其他的依賴诞仓,所以所有的圖形單元會被關(guān)閉缤苫。
在你要使用隔離功能隔離某個目標(biāo)前,你或許希望查看一下你要隔離的目標(biāo)中所有的依賴來保證重要的依賴不被停止:
systemctl list-dependencies multi-user.target
當(dāng)你認(rèn)為只有這些單元被激活可以滿足需要墅拭,輸入:
sudo systemctl isolate multi-user.target
使用重要事件的快捷方式
有一些被定義用來服務(wù)與重要事件的目標(biāo)如關(guān)機(jī)或重啟活玲。 然而,systemd也有一些添加了一些額外功能的快捷方式。
例如翼虫,讓系統(tǒng)計(jì)入安全模式(single-user)屑柔,你可以使用rescue命令代替isolate rescue.target
sudo systemctl rescue
這將產(chǎn)生額外的功能,提醒關(guān)于事件的用戶日志珍剑。
若想掛起系統(tǒng)掸宛,可以使用halt命令:
sudo systemctl halt
若要執(zhí)行徹底的關(guān)機(jī),使用poweroff命令:
sudo systemctl poweroff
重啟是reboot命令:
sudo systemctl reboot
這些都會給提示普通用戶不能使用該功能招拙,這些提示是簡單的運(yùn)行和隔離目標(biāo)不會給出的唧瘾。注意大多數(shù)機(jī)器會將這些快捷方式轉(zhuǎn)變成更加方便的使用方式。
例如别凤,重啟系統(tǒng)饰序,可以鍵入:
sudo reboot
總結(jié)
到現(xiàn)在位置,你已經(jīng)熟悉了一些systemctl的基本能力规哪,用來允許你控制和使用systemd實(shí)例求豫。該systemctl工具將會是你主要的服務(wù)控制和系統(tǒng)狀態(tài)管理工具。
然而systemctl操作主要是來操作systemd核心功能诉稍,還有別的systemd模塊系統(tǒng)被別的工具來控制蝠嘉。 其它能力,像日志管理和用戶對話被單獨(dú)的守護(hù)進(jìn)程和管理工具控制(**journald/journalctl ** 和 logind/loginctl). 花點(diǎn)時間來熟悉這些工具和守護(hù)進(jìn)程杯巨,將會是管理系統(tǒng)變得很簡單蚤告。