国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

Linux項目開發,你必須了解Systemd服務!

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



本文地址:http://m.qingdxww.cn/thread-860776-1-1.html     【打印本頁】

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

廠商推薦

  • Microchip視頻專區
  • PIC32CM LS60 Curiosity Pro評估工具包
  • 實時控制解決方案的正確選擇——數字信號控制器(DSC)或通用MCU
  • PIC32CK SG單片機——輕松滿足新型網絡安全要求
  • dsPIC® DSC:攻克各種觸摸傳感挑戰的電容式觸摸解決方案
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产午夜| 亚洲综合国产一区在线| 亚洲精品第一国产麻豆| 一本色道久久综合| 欧美精品老牛影视| 日韩系列在线| 日本成人在线视频网站| 午夜91| 日本三级一区二区三区| 欧美大片在线观看成人| 色就干| 亚洲国产午夜精品乱码| 日韩波多野结衣| 天天操天天干天天透| 日本免费三区| 欧美亚洲日本在线| 欧美成人日韩| 午夜性色福利视频| 欧美一区二区三区日韩免费播| 亚洲欧美中文日韩综合| 亚洲男女免费视频| 亚洲国产一区二区三区在线观看| 日本午夜精品一本在线观看| 午夜专区| 人人澡人人爽人人精品| 亚洲色图狠狠干| 思思久久99| 亚洲精品99久久久久中文字幕 | 亚洲国产精品人久久| 日本一本草久p| 日一级片| 三级黄色片免费看| 手机在线三级| 五月婷婷一区二区| 日本久久99| 日韩精品久久久免费观看夜色| 一级片成人| 天堂成人在线| 欧美激情国产一区在线不卡| 啪啪一级| 欧美在线亚洲国产免m观看|