国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

武漢萬象奧科 ? 2024-06-18 17:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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.SystemdService配置文件

每一個被管理單元(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 server Documentation=man:sshd(8) man:sshd_config(5) After=network.target auditd.service ConditionPathExists=!/etc/ssh/sshd_not_to_be_run [Service] EnvironmentFile=-/etc/default/ssh ExecStartPre=/usr/sbin/sshd -t ExecStart=/usr/sbin/sshd -D $SSHD_OPTS ExecReload=/usr/sbin/sshd -t ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartPreventExitStatus=255 Type=notify RuntimeDirectory=sshd RuntimeDirectoryMode=0755 [Install] WantedBy=multi-user.target Alias=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.socket

3.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=oneshot ExecStart=/absolute/path/to/hello-world.exe StandardOutput=file:/absolute/path/to/stdout-file

然后啟動定時器,并查看狀態:

systemctl start hello-world.timer systemctl status hello-world.timer

4.服務異常重運行

為了確保服務在遭遇故障時能夠自動重啟。在Systemd的服務單元文件中,Restart指令是控制服務重啟行為的核心設置。本文章將探討Restart=on-failure與Restart=always這兩個選項的區別,幫助開發人員對系統服務做出更適合的選擇。Restart指令定義了當服務停止時Systemd的行為。它可以精細控制服務在遇到不同退出情況時是否應該重啟。這是確保關鍵服務可靠性的重要機制,尤其是在生產環境中,服務的持續運行對業務至關重要

4.1 Restart=on-failure:智能重啟

當服務單元文件中設置了Restart=on-failure時,Systemd會在服務因錯誤退出時嘗試重啟服務。"錯誤退出"通常是指服務以非零狀態碼結束運行,這可能是由于程序崩潰、遇到未處理的異常或其他非正常情況導致的。例如,如果你的服務由于內存不足而崩潰,on-failure將確保服務嘗試重新啟動。但如果服務是由于正常的系統維護任務而被停止,或者開發人員故意停止服務進行調試,那么它將不會被重啟。

其應用場景如下:

生產環境:在不希望因為維護或更新操作而自動重啟服務的生產環境中使用。

故障排除:當服務可能需要在出現問題時停止,以便進行故障排除時。

有條件的重啟:當你只想在服務因特定問題而停止時重啟。

4.2 Restart=always:無條件重啟

與on-failure相對的是Restart=always選項。不管服務是如何終止的,系統都會嘗試將其重啟。這意味著即使服務被管理員有意關閉,或者服務正常結束,Systemd也會立即嘗試將其重啟。

這種策略適用于那些必須始終運行的服務,無論它們是因為何種原因停止的。這確保了即使在進行系統更新或維護時,服務也能盡可能快地恢復運行。

其應用場景如下:

關鍵服務:對于那些系統的核心功能,如數據庫服務或Web服務器,這些服務的任何停機時間都是不可接受的。

高可用性要求:在需要最大程度減少服務停機時間的環境中。

簡化管理:在希望無論服務如何停止都能立即重啟的情況下。



聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    88

    文章

    11760

    瀏覽量

    219014
  • Linux系統
    +關注

    關注

    4

    文章

    614

    瀏覽量

    29905
  • Unit
    +關注

    關注

    0

    文章

    20

    瀏覽量

    8279
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    內核構建正常,但 systemd加載失敗,為什么?

    to .1mDebian GNU/Linux bookworm/sid![13.050599] systemd[1]: Queued start job for default target Graphical
    發表于 03-05 06:36

    技術分享| 什么是Systemd

    繼上次針對我司IAC-IMX8MP-KitYocto系統上Systemd的簡介,這篇文章主要分析一下關于Service的一些關鍵屬性,幫助大家更好的了解Systemd最重要的單元,更好的控制自己
    的頭像 發表于 12-18 17:27 ?579次閱讀
    技術分享| 什么是<b class='flag-5'>Systemd</b>

    別再裝系統了!Linux 鏡像到底是什么?一篇講到你懷疑人生

    多小、環境多復雜,如何快速安裝、部署和維護 Linux 系統,都是開發者和運維人員必須掌握的核心技能。 這時,“Linux 鏡像文件”就顯得尤為重要。它就像一份完整的系統快照,讓
    的頭像 發表于 12-03 16:12 ?802次閱讀
    別再裝系統了!<b class='flag-5'>Linux</b> 鏡像到底是什么?一篇講到你懷疑人生

    【技術分享】Systemd原生服務配置最佳實踐(下)

    上期我們說到sysv的規范,創建以及示例,那么我們今天就來講講Systemd的原生服務配置。為何要遷移到Systemd原生服務?盡管規范化的SysV腳本可臨時解決問題,但可能存在以下缺
    的頭像 發表于 10-29 11:40 ?416次閱讀
    【技術分享】<b class='flag-5'>Systemd</b>原生<b class='flag-5'>服務</b>配置最佳實踐(下)

    【技術分享】正確編寫SysV Init腳本以實現Systemd兼容(上)

    嵌入式的ubuntu系統如何寫好SysVInit腳本呢?與system服務又有什么差別呢?一起隨著文章來探究吧。問題背景許多傳統Linux服務仍使用SysVInit腳本(/etc/init.d
    的頭像 發表于 10-28 11:45 ?715次閱讀
    【技術分享】正確編寫SysV Init腳本以實現<b class='flag-5'>Systemd</b>兼容(上)

    飛凌嵌入式ElfBoard-常用的網絡服務的搭建之SSH服務搭建

    、Solaris、Digital UNIX、Irix等,都可運行。1.在系統開發過程中經常會遇到下列情形1)Linux主機不在本地,但又要使用或者維護這臺計算機;2)一個嵌入式Linux產品不方便接
    發表于 10-24 08:48

    ElfBoard技術貼|如何在【RK3588】ELF 2開發板上實現開機自啟應用

    Systemd作為Linux系統默認的初始化系統和服務管理器,憑借其并行啟動、依賴管理及統一配置機制,顯著提升了系統啟動效率。針對開機自啟動需求,Systemd的實現機制如下:1、
    的頭像 發表于 09-08 14:11 ?4961次閱讀
    ElfBoard技術貼|如何在【RK3588】ELF 2<b class='flag-5'>開發</b>板上實現開機自啟應用

    Linux 應用開發手冊

    T507linux應用開發手冊
    發表于 08-22 17:01 ?15次下載

    【「Yocto項目實戰教程:高效定制嵌入式Linux系統」閱讀體驗】+基礎概念學習理解

    。為了對珠峰更了解些,開始接觸 Linux 系統開發,并逐漸認識到 Yocto 項目在定制嵌入式 Linux 系統方面的重要性。所以很想拜讀
    發表于 08-04 22:29

    關于SFP連接器必須了解的那些知識

    關于SFP連接器必須了解的那些知識 一、SFP光籠子的作用及材料組成 1.光籠子的概念與作用 ① 光籠子是什么? SFP Cage(Small Form-factor Pluggable Cage
    的頭像 發表于 06-17 09:42 ?1068次閱讀
    關于SFP連接器<b class='flag-5'>你</b><b class='flag-5'>必須</b><b class='flag-5'>了解</b>的那些知識

    詳解Linux系統中的服務管理

    Linux中,無論何時當你安裝任何帶有服務和守護進程的包,系統默認會把這些服務的初始化及 systemd腳本添加進去,不過此時它們并沒有被啟用。
    的頭像 發表于 05-23 15:10 ?833次閱讀
    詳解<b class='flag-5'>Linux</b>系統中的<b class='flag-5'>服務</b>管理

    用一套Linux系統,撐起整個芯片設計平臺?CFA團隊教你如何搭好EDA智算平臺的技術底座

    的問題。 而要打好這個“平臺地基”,必須得了解——Linux****系統的基礎框架。 Linux :芯片設計工具運行的“舞臺” Linux
    發表于 05-07 14:44

    鴻蒙應用元服務開發-Account Kit配置scope權限

    注意,scope權限申請當前僅針對企業開發者開放。 scope權限具體覆蓋場景參見下表,按需申請。 申請步驟如下: 1.登錄華為開發者聯盟,選擇“管理中心 > API服務 &
    發表于 04-11 15:50

    Linux網絡設置與基礎服務

    Linux網絡設置與基礎服務
    的頭像 發表于 04-09 11:51 ?3405次閱讀
    <b class='flag-5'>Linux</b>網絡設置與基礎<b class='flag-5'>服務</b>

    如何在RakSmart服務器上用Linux系統部署DeepSeek

    Linux系統 DeepSeek 部署方案,結合RakSmart 服務器硬件推薦及多場景適配建議,主機推薦小編為您整理發布如何在RakSmart服務器上用Linux系統部DeepSee
    的頭像 發表于 03-14 11:53 ?773次閱讀