systemd系統守護進程的操作命令


目錄

systemd #system daemon系統守護進程

unit:單元

Target Unit說明

systemd中unit配置目錄、文件說明

總結以及注意事項

chkconfig,service查詢服務


systemd #system daemon系統守護進程

一、由來

歷史上,Linux 的啟動一直采用init進程。

下面的命令用來啟動服務。

  1. /etc/init.d/apache2 start或者service apache2 start

這種方法有兩個缺點。

  1. 啟動時間長。init進程是串行啟動,只有前一個進程啟動完,才會啟動下一個進程。
  2. 啟動腳本復雜。init進程只是執行啟動腳本,不管其他事情。腳本需要自己處理各種情況,這往往使得腳本變得很長。

二、Systemd 概述

Systemd 就是為了解決這些問題而誕生的。它的設計目標是,為系統的啟動和管理提供一套完整的解決方案。

根據 Linux 慣例,字母d是守護進程(daemon)的縮寫。 Systemd 這個名字的含義,就是它要守護整個系統。

使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成為系統的第一個進程(PID 等於 1),其他進程都是它的子進程。

  1. systemctl --version

上面的命令查看 Systemd 的版本。

Systemd 的優點是功能強大,使用方便,缺點是體系龐大,非常復雜。事實上,現在還有很多人反對使用 Systemd,理由就是它過於復雜,與操作系統的其他部分強耦合,違反"keep simple, keep stupid"的Unix 哲學。

三、systemd可以管理所有系統資源,不同的資源統稱為unit(單元,單位,組件,部件等解釋),可以把linux啟動后所運行的每個程序當成一個unit來看。如果想要控制systemd下的各種Unit,則可使用systemctl命令,詳細用法如此鏈接:systemctl命令用法.note

unit:單元

unit分為service,socket,target,path,snapshot,timer等多種不同的類型(type)以下是12中Unit Type

  1. .service unit #用於啟動和控制守護進程以及他們所包含的進程
  2. .socket nuit #進程間通信的socket
  3. target nuit #是一群unit的集合
  4. device unit #硬件設備
  5. mount unit #文件系統掛載點
  6. automoount unit #自動掛載點
  7. timer unit #定時器
  8. swap unit #關於swap文件
  9. snapshot unit #關於systemd快照,可以切回某個快照
  10. path unit #文件或路徑
  11. slice unit #進程組
  12. scope unit #不是由systemd啟動的外部進程

 

通過文件名區分各個unit的不同類型,systemctl命令用法中對unit的操作,UnitName中也需要以這個Name.XXXX模式輸入

注意:Unit與Unit File的區別

Unit的依賴性:不管什么Type的Unit,都會存在依賴性,包括該Unit在誰之前啟動(want,before),該Unit在誰之后啟動(requires,after)

當啟動一個Unit的時候,會先去/usr/lib/systemd/system/和/etc/systemd/system/兩個目錄里查找UnitName目錄和UnitName文件,比如graphical.target這個Unit

  1. graphical.target.wants目錄指運行該Unit之前需要運行什么
  2. graphical.target.requires目錄指運行該Unit之后需要運行什么
  3. 然后通過graphical.target文件,確定運行該Unit之前需要先運行什么后運行什么
  4. graphical.target文件中的want,before,requires,after字段說明詳見本文下面的Unit配置文件說明

Target Unit說明

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

 

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

注意

  1. 在啟動系統的時候,也是首先通過查詢target中的內容進行啟動相應的Unit,詳細啟動過程見1.1.系統啟動流程.note
  2. 傳統的init啟動模式里面,有 RunLevel 的概念,跟 Target 的作用很類似。不同的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啟動,但是多個 Target 可以同時啟動。比如我啟動graphical.target則里面就包含運行圖形界面的Unit和multi-user.target中的所有Unit。

systemd中unit配置目錄、文件說明

配置目錄說明:

  1. /usr/lib/systemd/system/ #官方安裝的軟件,默認啟動腳本配置文件全在這里
  2. /run/systemd/system/ #系統執行過程中所產生的服務腳本,執行優先級比上一個高
  3. /etc/systemd/system/ #管理員依據主機系統的需求所創建的執行腳本,執行優先級又比上一個高。當使用systemctl enable|disable UNIT命令的時候,會自動在該目錄中創建軟連接到/usr/lib/systemd/system/目錄中的Unit文件
  4. 目錄例子:
    1. /usr/lib/systemd/system/vsftpd.service :官方釋出的默認配置文件;
    2. /etc/systemd/system/vsftpd.service.d/CUSTOM.conf :在/etc/systemd/system下面創建與配置文件相同文件名的目錄,但是要加上.d的擴展名。然后在該目錄下創建配置文件即可。另外,配置文件最好附文件名取名為.conf較佳!在這個目錄下的文件會“累加其他設置”進入/usr/lib/systemd/system/vsftpd.service內喔!
    3. /etc/systemd/system/vsftpd.service.wants/ :此目錄內的文件為鏈接文件,設置相依服務的鏈接。意思是啟動了vsftpd.service之后,最好再加上這目錄下面建議的服務。
    4. /etc/systemd/system/vsftpd.service.requires/ :此目錄內的文件為鏈接文件,設置相依服務的鏈接。意思是在啟動vsftpd.service之前,需要事先啟動哪些服務的意思。

(可以通過建立新的這種文件,達到運行多個同樣進程的目的,還可以建立多個VSFTPD,監聽不同端口)

一般情況文件放在/lib/systemd/system/文件夾下,文件名為UnitName.UnitType,例vsftpd.service

 

配置文件分為4種狀態,當啟用(enable)該文件的時候,從配置文件目錄建立一個軟連接到/etc/systemd/system/目錄下,當禁用(disable)該文件的時候,會把該軟連接刪除。如果在/etc/systemd/system/目錄下有Unit的配置文件,則開機則會自動加載並啟動Unit。可以使用命令systemctl list-unit-files命令查看所有的配置文件狀態。結論:建立了連接則說明該Unit會開機啟動,沒建立連接則該Unit不會開機啟動;還可以禁止該Unit建立連接,則說明該Unit永遠不能開機啟動。

 

  1. enabled:啟用(該文件已建立鏈接)
  2. disabled:禁用(該文件沒建立鏈接)
  3. static:這個文件不可以被建立鏈接,但是可以被其他服務進行關聯啟動
  4. masked:該配置文件被禁止建立啟動鏈接,可以使用systemctl unmask命令開啟

配置文件分三個部分

第一部分:[Unit] #unit本身的說明,以及與其他相依賴的daemon的設置,包括在什么服務之前或之后啟動等設置

  1. Description #該Unit描述,用systemctl list-units和systemctl status查看服務時候的描述內容就是這里定義的
  2. Documentation #提供該Unit可以進一步文件查詢的地址或者位置
  3. After(Before) #在哪些之后(前)啟動,說明該Unit可以在哪些daemon啟動后(前)才能夠啟動,非強制性,只是推薦規范
  4. Requires #需要啟動哪些,說明啟動該Unit需要啟動哪些Unit才能啟動,強制性的,如果不啟動該項定義的daemon則無法啟動該Unit
  5. Wants #想要啟動哪些,與Requires相反,說明啟動該Unit后想要啟動哪些daemon,非強制
  6. Conflicts #代表該Unit與列表中的daemon有沖突,如果該設置里的服務啟動了,那么這個Unit就不能啟動

第二部分:[Service],[Socket],[Timer].[Mount],[Path]...等 #不同的unit type就使用相對應的設置項目,這里面設定服務啟動的腳本,環境配置文件文件名,重啟方式等等

  1. [Service]區塊用來 Service 的配置,只有 Service 類型的 Unit 才有這個區塊。它的主要字段如下。
  2. Type:定義啟動時的進程行為。它有以下幾種值。
  3. Type=simple:默認值,執行ExecStart指定的命令,啟動主進程
  4. Type=forking:以 fork 方式從父進程創建子進程,創建后父進程會立即退出
  5. Type=oneshot:一次性進程,Systemd 會等當前服務退出,再繼續往下執行
  6. Type=dbus:當前服務通過D-Bus啟動
  7. Type=notify:當前服務啟動完畢,會通知Systemd,再繼續往下執行
  8. Type=idle:若有其他任務執行完畢,當前服務才會運行
  9. ExecStart:啟動當前服務的命令
  10. ExecStartPre:啟動當前服務之前執行的命令
  11. ExecStartPost:啟動當前服務之后執行的命令
  12. ExecReload:重啟當前服務時執行的命令
  13. ExecStop:停止當前服務時執行的命令
  14. ExecStopPost:停止當其服務之后執行的命令
  15. RestartSec:自動重啟當前服務間隔的秒數
  16. Restart:定義何種情況 Systemd 會自動重啟當前服務,可能的值包括always(總是重啟)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
  17. TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數
  18. Environment:指定環境變量

第三部分:[Install]指定unit安裝在哪個target(unit集合)里面去

  1. [Install]通常是配置文件的最后一個區塊,用來定義如何啟動,以及是否開機啟動。它的主要字段如下。
  2. WantedBy:它的值是一個或多個 Target,當前 Unit 激活時(enable)符號鏈接會放入/etc/systemd/system目錄下面以 Target 名 + .wants后綴構成的子目錄中
  3. RequiredBy:它的值是一個或多個 Target,當前 Unit 激活時,符號鏈接會放入/etc/systemd/system目錄下面以 Target 名 + .required后綴構成的子目錄中
  4. Alias:當前 Unit 可用於啟動的別名
  5. Also:當前 Unit 激活(enable)時,會被同時激活的其他 Unit

總結以及注意事項

在使用systemctl命令時,會有兩個子命令,systemctl list-units和systemctl list-unit-files,這倆命令的區別如下

  1. list-units是列出已經載入的Unit(加上-a選項可以看start和stop所有的),其中還包括各種.device的unit,這類設備是硬件,沒有配置文件的,不會再list-unit-files命令下列出來
  2. list-unit-files是列出所有已經安裝的Unit的配置文件(有一部分Unit是沒有配置文件的),安裝完的Unit會把配置文件存放在/lib/systemd/system/目錄下,而且通過查看list-unit-files還能看出來是否是開機啟動,具體原因請見下文的《systemd的unit配置文件說明》

chkconfig,service查詢服務

service --status-all #將會運行所有的啟動腳本來顯示各個服務的運行狀態

查看服務自啟動 chkconfig

chkconfig --list 查看所有服務的自啟動情況

chkconfig Susefirewall2_setup off 設置為開機不自啟動

chkconfig Susefirewall2_init off 設置為開機不自啟動

chkconfig --level 35 vsftpd on


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM