日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Centos7 Systemd詳解

 曾淼Mark 2020-09-14

    目錄

    一、systemd的由來

    二、systemd

    三、服務管理

    1、systemctl2

    2、服務查看

    3、服務狀態(tài)

    4hostnamectl

    5、localectl

    6 timedatectl

    7、loginctl

    四、unit

    1、Unit類型

    2、systemctl list-units命令可以查看當前系統(tǒng)的所有 Unit 

    3、unit狀態(tài)

    4、依賴關系

    五、unit配置文件

    1、概述

    2、配置文件狀態(tài)

    3、配置文件格式

    1)unit配置文件格式

    2)Unit段的常用選項

    3)service常用的選項

    4)install 常用選項

    六、Target

    1、Target命令

    2Target與傳統(tǒng) RunLevel 的對應關系如下

    3、它與init進程的主要差別如下

    七、日志管理

    1、journalctl功能強大,用法非常多

    2、查看指定優(yōu)先級(及其以上級別)的日志,共有8

 

一、systemd的由來

Linux一直以來采用init進程但是init有兩個缺點:

1、啟動時間長。Init進程是串行啟動,只有前一個進程啟動完,才會啟動下一個進程。(這也是Centos5的主要特征)

2、啟動腳本復雜。Init進程只是執(zhí)行啟動腳本,不管其他事情。腳本需要自己處理各種情況,這使得腳本變得很長而且復雜。

Init:

  Centos 5 Sys init 是啟動速度最慢的,串行啟動過程,無論進程相互之間有無依賴關系。

  Centos6 Upstart init 相對啟動速度快一點有所改進。有依賴的進程之間依次啟動而其他與之沒有依賴關系的則并行同步啟動。

  Centos7 Systemd 與以上都不同。所有進程無論有無依賴關系則都是并行啟動(當然很多時候進程沒有真正啟動而是只有一個信號或者說是標記而已,在真正利用的時候才會真正啟動。)

二、systemd

  Systemd為了解決上文的問題而誕生。它的目標是,為系統(tǒng)的啟動和管理提供一套完整的解決方案。根據(jù)linux慣例,字母d是守護進程(daemon) 的縮寫。Systemd名字的含義就是 守護整個系統(tǒng)。

  Centos 7里systemd代替了init,成為了系統(tǒng)的第一個進程。PID為1.其他所有的進程都是它的子進程。Systemd 的優(yōu)點是功能強大,使用方便,缺點是體系龐大,非常復雜。事實上,現(xiàn)在還有很多人反對使用 Systemd,理由就是它過于復雜,與操作系統(tǒng)的其他部分強耦合,違反"keep simple, keep stupid"的Unix 哲學。

    Systemd 架構(gòu)圖

wKiom1g-zn-StzPKAABKa8Z3kwk613.png

 

三、服務管理

   1、systemctl

        Systemctl是systemd的主要命令,用于管理系統(tǒng)。

Centos  7 :service unit

注意:能兼容早期的服務腳本

   命令格

    

#systemctl COMMAND name.service
     重啟系統(tǒng)
    #  systemctl reboot
     關閉系統(tǒng),切斷電源
    #  systemctl poweroff
     CPU停止工作
    #  systemctl halt
     暫停系統(tǒng)
    #  systemctl suspend
     讓系統(tǒng)進入冬眠狀態(tài)
    #  systemctl hibernate
     讓系統(tǒng)進入交互式休眠狀態(tài)
    #  systemctl hybrid-sleep
     啟動進入救援狀態(tài)(單用戶狀態(tài))
    # systemctl rescue
    啟動服務
    #service name start ==> systemctl start name.service
    停止服務
    #service name stop ==> systemctl  stop name.service
    重啟服務
    #service name restart ==> systemctl restart name.service
    查看服務狀態(tài)
    #service name status ==> systemctl status name.service
    條件式重啟:已啟動才重啟,否則不做操作
    #service name condrestart ==> systemctl tryrestart name.service
    重載或重啟服務:先加載,再啟動
    #systemctl reload-or-restart name.service
    重載或條件式重啟服務:
    #systemctl reload-or-try-restart name.service
    禁止自動和手動啟動:
    #systemctl mask name.service
    取消禁止:
    #systemctl unmask name.service

   2、服務查看:

 查看所有服務的開機自啟狀態(tài):
    chkconfig --list ==> systemctl list-unit-files --type service
    用來列出該服務在哪些運行級別下啟用和禁用
    chkconfig sshd –list  ==>ls /etc/systemd/system/*.wants/sshd.service
    查看服務是否開機自啟:
    systemctl is-enabled name.service
    其它命令:
    查看服務的依賴關系:
    systemctl list-dependencies name.service
    殺掉進程:
    systemctl kill 進程名
    顯示某個 Unit 的所有底層參數(shù)
    # systemctl show httpd.service
     顯示某個 Unit 的指定屬性的值
    # systemctl show -p CPUShares httpd.service
     設置某個 Unit 的指定屬性
    # sudo systemctl set-property httpd.service CPUShares=500

  3、服務狀態(tài):

      顯示狀態(tài)
    systemctl list-unit-files --type service –all 
     loaded:Unit 配置文件已處理
     active(running)一次或多次持續(xù)處理的運行
     active(exited)成功完成一次性的配置
     active(waiting)運行中,等待一個事件
     inactive不運行
     enabled開機啟動
     disabled開機不啟動
     static開機不啟動,但可被另一個啟用的服務激活

4、hostnamectl

hostnamectl命令用于查看當前主機的信息。
 顯示當前主機的信息
# hostnamectl
設置主機名。
# hostnamectl set-hostname rhel7

5、localectl

localectl命令用于查看本地化設置。
 查看本地化設置
# localectl
# 設置本地化參數(shù)。
# localectl set-locale LANG=en_GB.utf8
# localectl set-keymap en_GB

6、 timedatectl

timedatectl
timedatectl命令用于查看當前時區(qū)設置。
查看當前時區(qū)設置
顯示所有可用的時區(qū)
# timedatectl list-timezones                                                                                   
# 設置當前時區(qū)
$# timedatectl set-timezone America/New_York
# timedatectl set-time YYYY-MM-DD
# timedatectl set-time HH:MM:SS

7、loginctl

loginctl命令用于查看當前登錄的用戶。
# 列出當前session
# loginctl list-sessions
# 列出當前登錄用戶
# loginctl list-users
# 列出顯示指定用戶的信息
# loginctl show-user (ruanyf) 用戶

四、unit 

Systemd可以管理系統(tǒng)中所有資源。不同的資源統(tǒng)稱為unit(單位)。Unit表示不同類型的systemd對象,通過配置文件進程標識和配置;文件中主要包含了系統(tǒng)服務、監(jiān)聽socket、保存的系統(tǒng)快照以及其它與init相關的信息。

1、Unit類型

Unit一共分為12種。

Sysstemctl  –t help 查看unit類型

Service unit:文件擴展名為.Service,用于定義系統(tǒng)服務

Target unit : 文件名擴展為.target,用于模擬實現(xiàn)“運行級別”

Device unit :.device ,用于定義文件內(nèi)核識別設備

Mount unit: .mount 定義文件系統(tǒng)掛載點。

Socket unit: .socket, 用于標識進程間通信用的socket文件,也可在系統(tǒng)啟動時,延遲啟動服務,實現(xiàn)按需啟動

Snapshot unit: .snapshot, 管理系統(tǒng)快照

Swap unit: .swap, 用于標識swap設備

Automount unit: .automount,文件系統(tǒng)的自動掛載點

Path unit: .path,用于定義文件系統(tǒng)中的一個文件或目錄使用,常用于當文件系統(tǒng)變化時,延遲激活服務,如:spool目錄

Scope unit :不是由systemd啟動的外部進程

Slice unit :進程組

Timer unit :定時器

2、systemctl list-units命令可以查看當前系統(tǒng)的所有 Unit 。

 列出正在運行的 Unit

# systemctl list-units

 列出所有Unit,包括沒有找到配置文件的或者啟動失敗的

# systemctl list-units --all

 列出所有沒有運行的 Unit

# systemctl list-units --all --state=inactive

 列出所有加載失敗的 Unit

# systemctl list-units --failed

 列出所有正在運行的、類型為 service 的 Unit

# systemctl list-units --type=service

3、unit狀態(tài)

systemctl status命令用于查看系統(tǒng)狀態(tài)和單個 Unit 的狀態(tài)。

 顯示系統(tǒng)狀態(tài)

#systemctl status

 顯示單個 Unit 的狀態(tài)

# sysystemctl status bluetooth.service

 顯示遠程主機的某個 Unit 的狀態(tài)

# systemctl -H root@rhel7.example.com status httpd.service

除了status命令,systemctl還提供了三個查詢狀態(tài)的簡單方法,主要供腳本內(nèi)部的判斷語句使用。

 顯示某個 Unit 是否正在運行

# systemctl is-active application.service

 顯示某個 Unit 是否處于啟動失敗狀態(tài)

# systemctl is-failed application.service

 顯示某個 Unit 服務是否建立了啟動鏈接

# systemctl is-enabled application.service

4、依賴關系

Unit 之間存在依賴關系:A 依賴于 B,就意味著 Systemd 在啟動 A 的時候,同時會去啟動 B。

#systemctl list-dependencies命令列出一個 Unit 的所有依賴。

# systemctl list-dependencies nginx.service

上面命令的輸出結(jié)果之中,有些依賴是 Target 類型(詳見下文),默認不會展開顯示。如果要展開 Target,就需要使用--all參數(shù)。

# systemctl list-dependencies --all nginx.service

五、unit配置文件

1、概述

每一個 Unit 都有一個配置文件,告訴 Systemd 怎么啟動這個 Unit 。

Systemd 默認從目錄/etc/systemd/system/讀取配置文件。但是,里面存放的大部分文件都是符號鏈接,指向目錄/usr/lib/systemd/system/,真正的配置文件存放在那個目錄。

systemctl enable httpd.service命令用于在上面兩個目錄之間,建立符號鏈接關系。(Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.)等同于 ln -s /usr/lib/systemd/system/httpd.service /etc/systemd/system/multi-user.target.wants/httpd.service。當然systemdctl  diable  httpd.service 則相當于刪除這個軟連接。

/usr/lib/system/system:每個服務最主要的啟動腳本設置,類似于之前的/etc/init.d/

/run/system/system:系統(tǒng)執(zhí)行過程中所產(chǎn)生的服務腳本,與上面目錄優(yōu)先運行。

/etc/systemd/system:管理員建立的執(zhí)行腳本,類似于/etc/rc.d/rcN.d/Sxx的功能,比上面目錄優(yōu)先運行。

2、配置文件狀態(tài)

systemctl list-unit-files命令用于列出所有配置文件。

 列出所有配置文件

#systemctl list-unit-files

 列出指定類型的配置文件

#systemctl list-unit-files --type=service

 systemctl list-unit-files該命令會輸出一個列表,從中可以看到每個配置文件的狀態(tài)。

   Unit config filestatus

lvm2-lvmetad.service                        disabled

lvm2-lvmetad.socket                         enabled 

lvm2-lvmpolld.service                       disabled

lvm2-lvmpolld.socket                        enabled

這個列表顯示每個配置文件的狀態(tài),一共有四種。

enabled:已建立啟動鏈接

disabled:沒建立啟動鏈接

static:該配置文件沒有[Install]部分(無法執(zhí)行),只能作為其他配置文件的依賴

masked:該配置文件被禁止建立啟動鏈接

注意,從配置文件的狀態(tài)無法看出,該 Unit 是否正在運行。這必須執(zhí)行前面提到的systemctl status命令。

# systemctl status httpd.service

3、配置文件格式

1)unit配置文件格式

 [Unit]

Description=backup /etc

Requires=atd.service

[Service]

Type=simple

ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"

[Install]

WantedBy=multi-user.target

[unit] :定義與Unit類型無關的通用選項;用于提供unit的描述信息、 unit行為及依賴關系等

[Service]:與特定類型相關的專用選項;此處為Service類型

[Install]:定義由“ systemctl enable”以及"systemctl disable“命令在實現(xiàn)服務啟用或禁用時用到的一些選項

2、Unit段的常用選項:Description:簡短描述

Description:描述信息

After:定義unit的啟動次序,表示當前unit應該晚于哪些

unit啟動,其功能與Before相反

Requires:依賴到的其它units,強依賴,被依賴的units無法激活時,當前unit也無法激活

Wants:依賴到的其它units,弱依賴

Conflicts:定義units間的沖突關系

BindsTo:與Requires類似,它指定的 Unit 如果退出,會導致當前 Unit 停止運行

Before:如果該字段指定的 Unit 也要啟動,那么必須在當前 Unit 之后啟動

Conflicts:這里指定的 Unit 不能與當前 Unit 同時運行

Condition...:當前 Unit 運行必須滿足的條件,否則不會運行

Assert...:當前 Unit 運行必須滿足的條件,否則會報啟動失敗

3、service常用的選項

Type:定義影響ExecStart及相關參數(shù)的功能的unit進程啟動類型

        simple:默認值,這個daemon主要由ExecStart接的指令串來啟動,啟動后常駐于內(nèi)存中

 forking:由ExecStart啟動的程序透過spawns延伸出其他子程序來作為此daemon的主要服務。原生父程序在啟動結(jié)束后就會終止。

      oneshot:與simple類似,不過這個程序在工作完畢后就結(jié)束了,不會常駐在內(nèi)存中

      dbus:與simple類似,但這個daemon必須要在取得一個D-Bus的名稱后,才會繼續(xù)運作.因此通常也要同時設定BusNname= 才行

      notify:在啟動完成后會發(fā)送一個通知消息。還需要配合NotifyAccess 來讓 Systemd 接收消息

      idle:與simple類似,要執(zhí)行這個daemon必須要所有的工作都順利執(zhí)行完畢后才會執(zhí)行。這類的daemon通

常是開機到最后才執(zhí)行即可的服務。

     EnvironmentFile:環(huán)境配置文件

     ExecStart:指明啟動unit要運行命令或腳本的絕對路徑

     ExecStartPre: ExecStart前運行

     ExecStartPost: ExecStart后運行

     ExecRsload: 重啟當前服務時執(zhí)行的命令

     ExecStopPost:停止當前服務之后執(zhí)行的命令

     ExecStartSec:自動重啟當前服務間隔的秒數(shù)

     ExecStop:指明停止unit要運行的命令或腳本

     Restart:當設定Restart=1 時,則當次daemon服務意外終止后,會再次自動啟動此服務。

    TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數(shù)。

    Environment:指定環(huán)境變量。

4、install 常用選項

Install段的常用選項:

Alias:別名,可使用systemctl command Alias.service

RequiredBy:被哪些units所依賴,強依賴

WantedBy:被哪些units所依賴,弱依賴

Also:安裝本服務的時候還要安裝別的相關服務

注意:對于新創(chuàng)建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而后可以選擇重啟。

# systemctl daemon-reload

# systemctl daemon-reload

#systemctl restart httpd.service

更加詳細的unit配置文件格式 請參考官方文檔

https://www./software/systemd/man/systemd.unit.html

六、Target

啟動計算機的時候,需要啟動大量的 Unit。如果每一次啟動,都要一一寫明本次啟動需要哪些 Unit,顯然非常不方便。Systemd 的解決方案就是 Target。

簡單說,Target 就是一個 Unit 組,包含許多相關的 Unit 。啟動某個 Target 的時候,Systemd 就會啟動里面所有的 Unit。從這個意義上說,Target 這個概念類似于"狀態(tài)點",啟動某個 Target 就好比啟動到某種狀態(tài)。

傳統(tǒng)的init啟動模式里面,有 RunLevel 的概念,跟 Target 的作用很類似。不同的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啟動,但是多個 Target 可以同時啟動。

1、Target命令

 查看當前系統(tǒng)的所有 Target

# systemctl list-unit-files --type=target

 查看一個 Target 包含的所有 Unit

# systemctl list-dependencies multi-user.target

 查看啟動時的默認 Target

# systemctl get-default

 設置啟動時的默認 Target

#  systemctl set-default multi-user.target

切換 Target 時,默認不關閉前一個 Target 啟動的進程, systemctl isolate 命令改變這種行為,

關閉前一個 Target 里面所有不屬于后一個 Target 的進程 systemctl isolate multi-user.target

2、Target與傳統(tǒng) RunLevel 的對應關系如下。

Traditional runlevel      New target name     Symbolically linked to...

Runlevel 0           |    runlevel0.target -> poweroff.target

Runlevel 1           |    runlevel1.target -> rescue.target

Runlevel 2           |    runlevel2.target -> multi-user.target

Runlevel 3           |    runlevel3.target -> multi-user.target

Runlevel 4           |    runlevel4.target -> multi-user.target

Runlevel 5           |    runlevel5.target -> graphical.target

Runlevel 6           |    runlevel6.target -> reboot.target

3、它與init進程的主要差別如下。

(1)默認的 RunLevel(在/etc/inittab文件設置)現(xiàn)在被默認的 Target 取代,位置是/etc/systemd/system/default.target,通常符號鏈接到graphical.target(圖形界面)或者multi-user.target(多用戶命令行)。

(2)啟動腳本的位置,以前是/etc/init.d目錄,符號鏈接到不同的 RunLevel 目錄 (比如/etc/rc3.d、/etc/rc5.d等),現(xiàn)在則存放在/lib/systemd/system和/etc/systemd/system目錄。

(3)配置文件的位置,以前init進程的配置文件是/etc/inittab,各種服務的配置文件存放在/etc/sysconfig目錄?,F(xiàn)在的配置文件主要存放在/lib/systemd目錄,在/etc/systemd目錄里面的修改可以覆蓋原始設置。

七、日志管理

Systemd 統(tǒng)一管理所有 Unit 的啟動日志。帶來的好處就是,可以只用journalctl一個命令,查看所有日志(內(nèi)核日志和應用日志)。日志的配置文件是/etc/systemd/journald.conf。

1、journalctl功能強大,用法非常多。

     查看所有日志(默認情況下 ,只保存本次啟動的日志)    
    #  journalctl
     查看內(nèi)核日志(不顯示應用日志)
    #  journalctl -k
     查看系統(tǒng)本次啟動的日志
    #  journalctl -b
    #  journalctl -b -0
     查看上一次啟動的日志(需更改設置)
    #  journalctl -b -1
     查看指定時間的日志
    #  journalctl --since="2012-10-30 18:17:16"
    #  journalctl --since "20 min ago"
    #  journalctl --since yesterday
    #  journalctl --since "2015-01-10" --until "2015-01-11 03:00"
    #  journalctl --since 09:00 --until "1 hour ago"
     顯示尾部的最新10行日志
    #  journalctl -n
     顯示尾部指定行數(shù)的日志
    #  journalctl -n 20
     實時滾動顯示最新日志
    #  journalctl -f
     查看指定服務的日志
    #  journalctl /usr/lib/systemd/systemd
     查看指定進程的日志
    #  journalctl _PID=1
     查看某個路徑的腳本的日志
    #  journalctl /usr/bin/bash
     查看指定用戶的日志
    #  journalctl _UID=33 --since today
     查看某個 Unit 的日志
    #  journalctl -u nginx.service
    #  journalctl -u nginx.service --since today
     實時滾動顯示某個 Unit 的最新日志
    #  journalctl -u nginx.service -f
     合并顯示多個 Unit 的日志
    # journalctl -u nginx.service -u php-fpm.service --since today

2、查看指定優(yōu)先級(及其以上級別)的日志,共有8級

     0: emerg
     1: alert
     2: crit
     3: err
     4: warning
     5: notice
     6: info
     7: debug
    #  journalctl -p err -b
     日志默認分頁輸出,--no-pager 改為正常的標準輸出
    #  journalctl --no-pager
     以 JSON 格式(單行)輸出
    #  journalctl -b -u nginx.service -o json
     以 JSON 格式(多行)輸出,可讀性更好
    #  journalctl -b -u nginx.serviceqq
     -o json-pretty
     顯示日志占據(jù)的硬盤空間
    #  journalctl --disk-usage
     指定日志文件占據(jù)的最大空間
    #  journalctl --vacuum-size=1G
     指定日志文件保存多久
    #  journalctl --vacuum-time=1years

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多