Linux項目開(kāi)發(fā),你必須了解Systemd服務(wù)!

發(fā)布時(shí)間:2024-6-18 17:26    發(fā)布者:武漢萬(wàn)象奧科
關(guān)鍵詞: Linux
1. Systemd 簡(jiǎn)介
Systemd是什么,以前l(fā)inux系統啟動(dòng)init機制,由于init一方面對于進(jìn)程的管理是串行化的,容易出現阻塞情況,另一方面init也僅僅是執行啟動(dòng)腳本,并不能對服務(wù)本身進(jìn)行更多的管理。Systemd就是為了解決這些問(wèn)題而誕生的。它的設計目標是,為系統的啟動(dòng)和管理提供一套完整的解決方案,根據Linux慣例,字母d是守護進(jìn)程(daemon)的縮寫(xiě),Systemd這個(gè)名字的含義,就是它要守護整個(gè)系統。使用了Systemd,就不需要再用init了。Systemd取代了initd,成為系統的第一個(gè)進(jìn)程(PID 等于 1),其他進(jìn)程都是它的子進(jìn)程。
Systemd是目前Linux系統上主要的系統守護進(jìn)程管理工具,有如下特點(diǎn):
1.支持并行化任務(wù)
2.同時(shí)采用socket式與D-Bus總線(xiàn)式激活服務(wù);
3.按需啟動(dòng)守護進(jìn)程(daemon);
4.利用Linux的cgroups監視進(jìn)程;
5.支持快照和系統恢復;
6.維護掛載點(diǎn)和自動(dòng)掛載點(diǎn);
7.各服務(wù)間基于依賴(lài)關(guān)系進(jìn)行精密控制。
Systemd可以管理所有系統資源,不同的資源統稱(chēng)為 Unit(單元),Unit一共分成以下12種。
1.Service:裝守護進(jìn)程的啟動(dòng)、停止、重啟和重載操作,是最常見(jiàn)的一種 Unit 文件
2.Target:多個(gè)Unit構成的一個(gè)邏輯組,用于對 Unit 文件進(jìn)行邏輯分組,引導其它 Unit 的執行。它替代了 SysV-init 運行級別的作用,并提供更靈活的基于特定設備事件的啟動(dòng)方式
3.Device:硬件設備,主要用于定義設備之間的依賴(lài)關(guān)系
4.Mount:文件系統的掛載點(diǎn),可以替代過(guò)去的 /etc/fstab 配置文件
5.Automount:自動(dòng)掛載點(diǎn),相當于 SysV-init 的 autofs 服務(wù)
6.Path:用于監控指定文件或路徑的變化,并觸發(fā)其它 Unit 運行
7.Scope:不是用戶(hù)創(chuàng )建的,而是 Systemd 運行時(shí)產(chǎn)生的,描述一些系統服務(wù)的分組信息
8.Slice:進(jìn)程組,用于表示一個(gè) CGroup 的樹(shù),通常也不是用戶(hù)創(chuàng )建的
9.Snapshot:Systemd快照,可以切回某個(gè)快照
10. Socket:監控來(lái)自于系統或網(wǎng)絡(luò )的數據消息,用于實(shí)現基于數據自動(dòng)觸發(fā)服務(wù)啟動(dòng)
11. Swap:虛擬內存的交換分區
12. Timer Unit:定時(shí)器,用于配置在特定時(shí)間觸發(fā)的任務(wù),替代了 Crontab 的功能
2. Systemd Service配置文件
每一個(gè)被管理單元(Unit)都需要有一個(gè)配置文件用于告知systemd對于該單元(Unit)的管理方式。Systemd默認從目錄/etc/systemd/system/讀取配置文件,但是里面存放的大部分文件都是符號鏈接,指向目錄/lib/systemd/system,配置文件存放于/lib/systemd/system/,開(kāi)機啟動(dòng)后會(huì )在/etc/systemd/system目錄建立軟鏈接文件,systemctl enable命令用于在/etc/systemd/system/與/lib/systemd/system/兩個(gè)目錄之間建立符號鏈接關(guān)系。systemctl disable命令用于在兩個(gè)目錄之間撤銷(xiāo)符號鏈接關(guān)系,相當于撤銷(xiāo)開(kāi)機啟動(dòng)。配置文件的后綴名,就是該Unit的種類(lèi),比如sshd.socket;如果命令行中省略后綴名,Systemd默認后綴名為.service,所以當systemctl enable sshd會(huì )被理解成systemctl enable sshd.service。
以sshd.service的配置為例,可用”systemctl cat sshd.service” 命令查看sshd服務(wù)的配置文件:
# /lib/systemd/system/ssh.service​[Unit]Description=OpenBSD Secure Shell serverDocumentation=man:sshd(8) man:sshd_config(5)After=network.target auditd.serviceConditionPathExists=!/etc/ssh/sshd_not_to_be_run​​[Service]EnvironmentFile=-/etc/default/sshExecStartPre=/usr/sbin/sshd -tExecStart=/usr/sbin/sshd -D $SSHD_OPTSExecReload=/usr/sbin/sshd -tExecReload=/bin/kill -HUP $MAINPIDKillMode=processRestart=on-failureRestartPreventExitStatus=255Type=notifyRuntimeDirectory=sshdRuntimeDirectoryMode=0755​​[Install]WantedBy=multi-user.targetAlias=sshd.service
通常一個(gè)service服務(wù)單元的配置包含3個(gè)區塊:Unit,Service和Install。
2.1      Unit區塊
[Unit]區塊通常是配置文件的第一個(gè)區塊,用來(lái)定義 Unit 的元數據,以及配置與其他 Unit 的關(guān)系。它的主要字段如下:
Description:簡(jiǎn)短描述
Documentation:文檔地址
Requires:當前Unit依賴(lài)的其他Unit,如果它們沒(méi)有運行,當前Unit會(huì )啟動(dòng)失敗
Wants:與當前Unit配合的其他Unit,如果它們沒(méi)有運行,當前Unit不會(huì )啟動(dòng)失敗
BindsTo:與Requires類(lèi)似,它指定的 Unit 如果退出,會(huì )導致當前Unit停止運行
Before:如果該字段指定的Unit也要啟動(dòng),那么必須在當前Unit之后啟動(dòng)
After:如果該字段指定的Unit也要啟動(dòng),那么必須在當前Unit之前啟動(dòng)
Conflicts:這里指定的Unit 不能與當前Unit同時(shí)運行
Condition...:當前Unit運行必須滿(mǎn)足的條件,否則不會(huì )運行
Assert...:當前Unit運行必須滿(mǎn)足的條件,否則會(huì )報啟動(dòng)失敗
2.2      Service區塊
[Service]區塊用來(lái)Service的配置,只有Service類(lèi)型的Unit才有這個(gè)區塊。它的主要字段如下:
Type:定義啟動(dòng)時(shí)的進(jìn)程行為。它有以下幾種值。
Type=simple:默認值,執行ExecStart指定的命令,啟動(dòng)主進(jìn)程
Type=forking:以fork方式從父進(jìn)程創(chuàng )建子進(jìn)程,創(chuàng )建后父進(jìn)程會(huì )立即退出
Type=oneshot:一次性進(jìn)程,Systemd會(huì )等當前服務(wù)退出,再繼續往下執行
Type=dbus:當前服務(wù)通過(guò)D-Bus啟動(dòng)
Type=notify:當前服務(wù)啟動(dòng)完畢,會(huì )通知Systemd,再繼續往下執行
Type=idle:若有其他任務(wù)執行完畢,當前服務(wù)才會(huì )運行
ExecStart:?jiǎn)?dòng)當前服務(wù)的命令
ExecStartPre:?jiǎn)?dòng)當前服務(wù)之前執行的命令
ExecStartPost:?jiǎn)?dòng)當前服務(wù)之后執行的命令
ExecReload:重啟當前服務(wù)時(shí)執行的命令
ExecStop:停止當前服務(wù)時(shí)執行的命令
ExecStopPost:停止當其服務(wù)之后執行的命令
RestartSec:自動(dòng)重啟當前服務(wù)間隔的秒數
Restart:定義何種情況Systemd會(huì )自動(dòng)重啟當前服務(wù),可能的值包括always(總是重啟)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
TimeoutSec:定義Systemd停止當前服務(wù)之前等待的秒數
Environment:指定環(huán)境變量
2.3      Install區塊
[Install]通常是配置文件的最后一個(gè)區塊,用來(lái)定義如何啟動(dòng),以及是否開(kāi)機啟動(dòng)。它的主要字段如下:
WantedBy:它的值是一個(gè)或多個(gè)Target,當前Unit激活時(shí)(enable)符號鏈接會(huì )放入/etc/systemd/system目錄下面以Target名+.wants后綴構成的子目錄中
RequiredBy:它的值是一個(gè)或多個(gè)Target,當前Unit激活時(shí),符號鏈接會(huì )放入/etc/systemd/system目錄下面以Target 名 + .required后綴構成的子目錄中
Alias:當前Unit 可用于啟動(dòng)的別名
Also:當前Unit激活(enable)時(shí),會(huì )被同時(shí)激活的其他Unit
3. 服務(wù)監控啟動(dòng)3.1      socket 觸發(fā)的服務(wù)
涉及網(wǎng)絡(luò )的服務(wù),可以通過(guò) socket 來(lái)觸發(fā)啟動(dòng)。也就是說(shuō)服務(wù)本身在沒(méi)連接業(yè)務(wù)時(shí)不用一直空跑著(zhù),可以讓systemd 幫忙監聽(tīng)一個(gè) socket ,以減少資源消耗。當真正有業(yè)務(wù)連接進(jìn)來(lái)時(shí),才喚醒目標服務(wù)。要達成這樣的配置,目標服務(wù)程序在實(shí)現上也有一定要求。
開(kāi)發(fā)一個(gè)常規的網(wǎng)絡(luò )服務(wù),一般有以下幾個(gè)關(guān)鍵步驟:
1.創(chuàng )建一個(gè) socket
2.調用 bind 將該 socket 綁定一個(gè)端口
3.調用 listen 監聽(tīng)端口,將該 socket 變成監聽(tīng)文件描敘符 fd
4.調用 accept 接收一個(gè)客戶(hù)端連接,得到一個(gè)新的連接文件描敘符 fd
5.讀寫(xiě)連接 socket 的 fd,完成業(yè)務(wù)邏輯
借助 systemd 強大且通用的服務(wù)功能,它可以幫忙完成前兩步,并且將 socket 的 fd 傳給被激活的程序,后者就只要從第3步開(kāi)始實(shí)現工作。
由socker觸發(fā)的服務(wù)對應于 systemd 的配置文件要有兩個(gè),后綴分別是.socket與.service ,除后綴外的文件名要相同,這樣就能自動(dòng)關(guān)聯(lián),例如名為hello-world-socket的服務(wù):
hello-world-socket.socket
[Unit]Description=Hello World Socket​​[Socket]ListenStream=0.0.0.0:1234
hello-world-socket.service
[Unit]Description=Hello World Socket Service​​[Service]ExecStart=/absolute/path/to/hello-world-socket.exe
如上,.socket 的配置,需要有 [Socket] 段,ListenStream 字段表示了要監聽(tīng) 的地址與端口。相應的 .service 配置,與之前例子一樣,描敘了如何啟動(dòng)服務(wù)。因為這是想由 socket 激活的 service ,故沒(méi)有配置重啟字段。
在 systemctl 的大多數子命令中,如 start ,其參數默認是假定 .service 單元 配置的。例如systemctl start hello-world-socket 等效于 systemctl start hello-world-socket.service 。但在這個(gè)例子中,有兩種同名單元配置, 且按要求先只啟動(dòng) hello-world-socket.socket ,所以要寫(xiě)完整的單元名:
systemctl start hello-world-socket.socket3.2      定時(shí)器觸發(fā)的服務(wù)
對于定時(shí)器觸發(fā)的服務(wù)首先要配置一個(gè) .timer 單元文件,例如:
hello-world.timer
[Unit]Description=The Hello-World Timer​[Timer]OnCalendar=*-*-* *:*:00
其中,OnCalendar 的配置格式同 crontab ,上例表示每分鐘觸發(fā)。
然后需要一個(gè)同名的 .service 單元文件。本文開(kāi)頭編譯的 hello-world.exe 正好 可作為該定時(shí)器啟動(dòng)的程序,例如:
hello-world.service
[Unit]Description=The Hello-World Timer​​[Service]Type=oneshotExecStart=/absolute/path/to/hello-world.exeStandardOutput=file:/absolute/path/to/stdout-file
然后啟動(dòng)定時(shí)器,并查看狀態(tài):
systemctl start hello-world.timersystemctl status hello-world.timer4. 服務(wù)異常重運行
為了確保服務(wù)在遭遇故障時(shí)能夠自動(dòng)重啟。在Systemd的服務(wù)單元文件中,Restart指令是控制服務(wù)重啟行為的核心設置。本文章將探討Restart=on-failure與Restart=always這兩個(gè)選項的區別,幫助開(kāi)發(fā)人員對系統服務(wù)做出更適合的選擇。Restart指令定義了當服務(wù)停止時(shí)Systemd的行為。它可以精細控制服務(wù)在遇到不同退出情況時(shí)是否應該重啟。這是確保關(guān)鍵服務(wù)可靠性的重要機制,尤其是在生產(chǎn)環(huán)境中,服務(wù)的持續運行對業(yè)務(wù)至關(guān)重要
4.1           Restart=on-failure:智能重啟
當服務(wù)單元文件中設置了Restart=on-failure時(shí),Systemd會(huì )在服務(wù)因錯誤退出時(shí)嘗試重啟服務(wù)。"錯誤退出"通常是指服務(wù)以非零狀態(tài)碼結束運行,這可能是由于程序崩潰、遇到未處理的異;蚱渌钦G闆r導致的。例如,如果你的服務(wù)由于內存不足而崩潰,on-failure將確保服務(wù)嘗試重新啟動(dòng)。但如果服務(wù)是由于正常的系統維護任務(wù)而被停止,或者開(kāi)發(fā)人員故意停止服務(wù)進(jìn)行調試,那么它將不會(huì )被重啟。
其應用場(chǎng)景如下:
生產(chǎn)環(huán)境:在不希望因為維護或更新操作而自動(dòng)重啟服務(wù)的生產(chǎn)環(huán)境中使用。
故障排除:當服務(wù)可能需要在出現問(wèn)題時(shí)停止,以便進(jìn)行故障排除時(shí)。
有條件的重啟:當你只想在服務(wù)因特定問(wèn)題而停止時(shí)重啟。
4.2      Restart=always:無(wú)條件重啟
與on-failure相對的是Restart=always選項。不管服務(wù)是如何終止的,系統都會(huì )嘗試將其重啟。這意味著(zhù)即使服務(wù)被管理員有意關(guān)閉,或者服務(wù)正常結束,Systemd也會(huì )立即嘗試將其重啟。
這種策略適用于那些必須始終運行的服務(wù),無(wú)論它們是因為何種原因停止的。這確保了即使在進(jìn)行系統更新或維護時(shí),服務(wù)也能盡可能快地恢復運行。
其應用場(chǎng)景如下:
關(guān)鍵服務(wù):對于那些系統的核心功能,如數據庫服務(wù)或Web服務(wù)器,這些服務(wù)的任何停機時(shí)間都是不可接受的。
高可用性要求:在需要最大程度減少服務(wù)停機時(shí)間的環(huán)境中。
簡(jiǎn)化管理:在希望無(wú)論服務(wù)如何停止都能立即重啟的情況下。



本文地址:http://selenalain.com/thread-860776-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页