Systemd(system daemon)實(shí)現(xiàn)系統(tǒng)服務(wù)間的依賴關(guān)系,并依此實(shí)現(xiàn)系統(tǒng)初始化時(shí)服務(wù)的并行啟動(dòng),同時(shí)達(dá)到降低Shell的系統(tǒng)開銷,最終替代init。
Systemd采用了一下新技術(shù):
采用Socket激活式與總線激活式服務(wù),以提高相互依賴的各服務(wù)的并行運(yùn)行性能。
采用Cgroups替代PID來追蹤進(jìn)程,即使是兩次fork之后生成的守護(hù)進(jìn)程也不會(huì)脫離systemd的控制。
學(xué)習(xí)Systemd的第一步,就是搞懂 Unit(單元)是什么?
Unit就是Systemd的最小 功能/管理 單位,是單個(gè)進(jìn)程的描述。一個(gè)個(gè)小的Unit相互調(diào)用和依賴,組成一個(gè)龐大的任務(wù)管理系統(tǒng),這就是Systemd的基本思想。
由于Systemd要做到事情太多,導(dǎo)致Unit有很多種不同的類型:
Service Unit - 用于定義系統(tǒng)服務(wù)
Target Unit - 用于模擬實(shí)現(xiàn)“運(yùn)行級(jí)別”
Socket Unit - 用于Systemd監(jiān)聽Socket,在有連接的時(shí)候再啟動(dòng)。
Device Unit - 用于定義內(nèi)核識(shí)別的設(shè)備
Mount Unit - 用于定義文件系統(tǒng)掛載
Snapshot Unit - 用于管理系統(tǒng)快照
Swap Unit - 用于標(biāo)識(shí)swap設(shè)備
Automount Unit - 用于文件系統(tǒng)自動(dòng)掛載
Path Unit - 用于定義文件系統(tǒng)中的文件或目錄
所有的Unit文件都存放在 /usr/lib/systemd/system和/etc/systemd/system
用于定義為系統(tǒng)服務(wù)。
通常由三部分組成,[Unit] [Service] [Install],各部分釋義:
[Unit] 段的常用選項(xiàng): Description:描述信息; 意義性描述; After:定義unit的啟動(dòng)次序,表示當(dāng)前unit應(yīng)該晚于哪些unit啟動(dòng);其功能與Before相反; Requies:依賴到的其它units;強(qiáng)依賴,被依賴的units無法激活時(shí),當(dāng)前unit即無法激活; Wants:依賴到的其它units;弱依賴; Conflicts:定義units間的沖突關(guān)系 [Service] 段的常用選項(xiàng): Type:用于定義影響ExecStart及相關(guān)參數(shù)的功能的unit進(jìn)程啟動(dòng)類型,其類型有: simple:默認(rèn)值,執(zhí)行ExecStart指定的命令,啟動(dòng)主進(jìn)程 forking:以 fork 方式從父進(jìn)程創(chuàng)建子進(jìn)程,創(chuàng)建后父進(jìn)程會(huì)立即退出 oneshot:一次性進(jìn)程,Systemd 會(huì)等當(dāng)前服務(wù)退出,再繼續(xù)往下執(zhí)行 dbus:當(dāng)前服務(wù)通過D-Bus啟動(dòng) notify:當(dāng)前服務(wù)啟動(dòng)完畢,會(huì)通知systemd再繼續(xù)往下執(zhí)行 idle:若有其他任務(wù)執(zhí)行完畢,當(dāng)前服務(wù)才會(huì)運(yùn)行 EnvironmentFile:環(huán)境配置文件; ExecStart:指明啟動(dòng)unit要運(yùn)行命令或腳本; ExecStartPre:在ExecStart之前運(yùn)行; ExecStartPost:在ExecStart之后運(yùn)行; ExecReload: 指明重新加載配置的命令或腳本; #示例 ExecReload=/bin/kill -HUP $MAINPID ExecStop:指明停止unit要運(yùn)行的命令或腳本; Restart:當(dāng)設(shè)定Restart=1時(shí),則當(dāng)次daemon服務(wù)意外終止后,會(huì)再次自動(dòng)啟動(dòng)。 [Install] 段的常用選項(xiàng): Alias:別名,可使用systemctl command Alias.service; RequiredBy:被哪些units所依賴; WantedBy:被哪些units所依賴 注意:對(duì)于新建或修改unit文件,需要通過命令 systemctl daemon-reload 重新加載。
定時(shí)器,可以定時(shí)調(diào)用其他Unit。
Service Unit只是定義了如何執(zhí)行任務(wù),還必須通過Timer Unit定義執(zhí)行時(shí)間,示例:
**定義Timer調(diào)用的my-timer.service **[Unit] Description = MyTimer [Service] ExecStart = /bin/echo '...Hello MyTimer...'**定義調(diào)用Service的my-timer.timer**[Unit] Description = Runs mytimer every minutes [Timer] OnUnitActiveSec = 1m Unit = mytimer.service [Install]WantedBy = multi-user.target # [Timer] 字段
OnActiveSec:定時(shí)器生效后,多少時(shí)間開始執(zhí)行任務(wù)
OnBootSec:系統(tǒng)啟動(dòng)后,多少時(shí)間開始執(zhí)行任務(wù)
OnStartupSec:Systemd 進(jìn)程啟動(dòng)后,多少時(shí)間開始執(zhí)行任務(wù)
OnUnitActiveSec:該單元上次執(zhí)行后,等多少時(shí)間再次執(zhí)行
OnUnitInactiveSec: 定時(shí)器上次關(guān)閉后多少時(shí)間,再次執(zhí)行
OnCalendar:基于絕對(duì)時(shí)間,而不是相對(duì)時(shí)間執(zhí)行
AccuracySec:如果因?yàn)楦鞣N原因,任務(wù)必須推遲執(zhí)行,推遲的最大秒數(shù),默認(rèn)是60秒
Unit:真正要執(zhí)行的任務(wù),默認(rèn)是同名的帶有.service后綴的單元
Persistent:如果設(shè)置了該字段,即使定時(shí)器到時(shí)沒有啟動(dòng),也會(huì)自動(dòng)執(zhí)行相應(yīng)的單元
WakeSystem:如果系統(tǒng)休眠,是否自動(dòng)喚醒系統(tǒng)
以 '.socket
' 為后綴的單元文件, 封裝了一個(gè)用于進(jìn)程間通信的套接字(socket)或管道(FIFO), 以支持基于套接字的啟動(dòng)。
讓Systemd監(jiān)聽Socket,在有連接的時(shí)候再啟動(dòng)該Unit,需要同名的Service。
可以查看系統(tǒng)自帶的sshd.socket示例。
Target是指一組相關(guān)進(jìn)程,有點(diǎn)像init進(jìn)程模式下面的啟動(dòng)級(jí)別。
當(dāng)WantedBy設(shè)置為指定target時(shí),執(zhí)行systemctl enable/disable [UnitName]時(shí),會(huì)自動(dòng)創(chuàng)建軟連接到/usr/lib/systemd/system下對(duì)應(yīng)的target.wants目錄中
可以通過 systemctl get-default 查看當(dāng)前運(yùn)行級(jí)別。
Target 與 傳統(tǒng) RunLevel 的對(duì)應(yīng)關(guān)系如下:
Runlevel 0 == poweroff.target
Runlevel 1 == rescue.target
Runlevel 2 == multi-user.target
Runlevel 3 == multi-user.target
Runlevel 4 == multi-user.target
Runlevel 5 == graphical.target
Runlevel 6 == reboot.target
# 查看單元狀態(tài) ## active (running): 進(jìn)程持續(xù)的運(yùn)行中 ## active (exited): 進(jìn)程成功完成一次執(zhí)行 ## active (waiting): 進(jìn)程等待中 ## inactive: 未運(yùn)行 $ systemctl status [UnitName] # 查看是否已啟用該單元 ## enable、disable或static ## static是指對(duì)應(yīng)的Unit文件中沒有定義[Install]區(qū)域,因此無法配置為開機(jī)啟動(dòng)服務(wù)。 $ systemctl is-enabled [UnitName] # 開機(jī)自動(dòng)執(zhí)行該單元 $ systemctl enable [UnitName] # 關(guān)閉開機(jī)自動(dòng)執(zhí)行 $ systemctl disable [UnitName] # 啟動(dòng)單元 $ systemctl start [UnitName] # 關(guān)閉單元 $ systemctl stop [UnitName] # 重啟單元 $ systemctl restart [UnitName] # 重新加載服務(wù)配置,而不中斷服務(wù) $ systemctl reload [UnitName] # 類似于 nginx -s reload # 殺死單元進(jìn)程 $ systemctl kill [UnitName] # 禁止服務(wù),無法啟動(dòng)或開機(jī)啟動(dòng) $ systemctl mask [UnitName] # List units that systemd currently has in memory. $ systemctl list-units # List unit files installed on the system, in combination with their enablement state (as reported by is-enabled). $ systemctl list-unit-files # Shows units required and wanted by the specified unit. $ systemctl list-dependencies
聯(lián)系客服