Linux系統(tǒng)中的bash進程、init進程和systemd進程都是一種守護進程(daemon),即在后臺運行的進程,為系統(tǒng)提供各種服務。
- bash 進程是一種命令行解釋器,它可以執(zhí)行用戶輸入的命令或者腳本文件,提供用戶與系統(tǒng)的交互界面。bash進程通常是用戶登錄后啟動的,每個用戶可以有多個bash進程。
- init 進程是Linux系統(tǒng)的第一個進程,它的進程號(PID)為1,它負責啟動和停止系統(tǒng)的其他進程。init進程是系統(tǒng)的根進程,所有的進程都是它的后代。init進程使用一系列的啟動腳本來控制系統(tǒng)的運行級別和服務。
- systemd 進程是一種新的初始化系統(tǒng),它取代了init進程,成為系統(tǒng)的第一個進程(PID為1),它的目的是提供更快速和更靈活的啟動方式。systemd進程使用一種叫做Unit的資源單位來管理系統(tǒng)的各種服務,它可以并行啟動多個服務,縮短系統(tǒng)的啟動時間。
bash進程、init進程和systemd進程之間的聯(lián)系是:
- bash進程是systemd進程的子進程,systemd進程是init進程的替代品。
- bash進程可以通過systemctl命令來控制systemd進程管理的服務,也可以通過service命令來控制init進程管理的服務。
- systemd進程可以兼容init進程的啟動腳本,也可以使用自己的配置文件來定義服務。
如果您想了解更多關于Linux系統(tǒng)中的進程的信息,您可以參考以下的網(wǎng)頁:
?
(1) linux的systemd與init的區(qū)別_systemd和init的區(qū)別-CSDN博客. https://blog.csdn.net/zhizhengguan/article/details/111653573.
(2) 【003】一文全面掌握Linux初始化進程(超詳細) - 知乎專欄. https://zhuanlan.zhihu.com/p/298087838.
(3) linux---systemd進程 - 盜哥泡茶去了 - 博客園. https://www.cnblogs.com/1016391912pm/p/12953781.html.
(4) init和systemd:Linux守護進程 - 知乎 - 知乎專欄. https://zhuanlan.zhihu.com/p/561776400.
以下為轉(zhuǎn)載
【003】一文全面掌握Linux初始化進程(超詳細) - 知乎
本文將詳細梳理Linux
系統(tǒng)的初始化進程systemd
。通過對此進程的理解,你將對系統(tǒng)的初始化有一個深入的理解,從而更好地理解其它的操作。
Linux
系統(tǒng)的開機過程是這樣的:從BIOS
開始,進入Boot Loader
,再加載內(nèi)核系統(tǒng),進行內(nèi)核初始化,最后啟動初始化進程。以前Linux
的啟動一直是采用init
進程的,啟動服務的方式如下:
$sudo /etc/init.d/apache2 start
或者
$service apache2 start
init
啟動方式有兩個缺點:
一是啟動時間長,
init
進程是串行啟動,只有前一個進程啟動完成,才會啟動下一個進程;二是啟動腳本復雜,
init
進程只執(zhí)行啟動腳本,不管其它事情,腳本需要處理各種情況,從而使得腳本變得很長。
1.systemd概述
根據(jù)Linux
慣例,字母d
是守護進程(daemon
)的縮寫, systemd
的含義是它要守護整個系統(tǒng)。 systemd
是為了解決initd
的缺點問題而誕生的, 它為系統(tǒng)的啟動和管理提供了一套完整的解決方案。
使用systemd
就不再需要initd
了,它成了系統(tǒng)的第一個進程(PID
= 1),其它進程都是它的子進程。
systemd
初始化進程服務采用并發(fā)啟動機制,開機速度得到了很大的提升。
可以用命令$ systemctl --version
命令 查看systemd
的版本。
systemd
的優(yōu)點是功能強大,使用方便,其缺點是體系龐大,非常復雜,與操作系統(tǒng)的其它部分強耦合,下圖是systemd
的體系架構(gòu)圖。
2. systemd對系統(tǒng)的管理
systemd
并不是一個命令,而是一組命令,涉及到對系統(tǒng)各方面的管理。
-
systemctl
是systemd
的主命令,用于管理系統(tǒng)。其常用的操作如下:
# 重啟系統(tǒng)
$ sudo systemctl reboot
# 關閉系統(tǒng),切斷電源
$ sudo systemctl poweroff
# CPU停止工作
$ sudo systemctl halt
# 暫停系統(tǒng)
$ sudo systemctl suspend
# 讓系統(tǒng)進入冬眠狀態(tài)
$ sudo systemctl hibernate
# 讓系統(tǒng)進入交互式休眠狀態(tài)
$ sudo systemctl hybrid-sleep
# 啟動進入救援狀態(tài)(單用戶狀態(tài))
$ sudo systemctl rescue
-
systemd-analyze
命令用于查看啟動時的耗時。其常用的操作如下:
# 查看啟動耗時
$ systemd-analyze
# 查看每個服務的啟動耗時
$ systemd-analyze blame
# 顯示瀑布狀的啟動過程流
$ systemd-analyze critical-chain
# 顯示指定服務的啟動流
$ systemd-analyze critical-chain atd.service
-
hostnamectl
命令用于查看當前主機的信息。其常用的操作如下:
# 顯示當前主機的信息
$ hostnamectl
# 設置主機名。
$ sudo hostnamectl set-hostname rhel8
-
localectl
命令用于查看本地化設置。其常用的操作如下:
# 查看本地化設置
$ localectl
# 設置本地化參數(shù)。
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB
-
timedatectl
命令用于查看當前時區(qū)設置。其常用的操作如下:
# 查看當前時區(qū)設置
$ timedatectl
# 顯示所有可用的時區(qū)
$ timedatectl list-timezones
# 設置當前時區(qū)
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS
-
loginctl
命令用于查看當前登錄用戶的相關信息。其常用的操作如下:
# 列出當前session
$ loginctl list-sessions
# 列出當前登錄用戶
$ loginctl list-users
# 列出顯示指定用戶的信息
$ loginctl show-user wujitao
3. 資源單位Unit
systemd
可以管理所有的系統(tǒng)資源,不同的資源統(tǒng)稱為Unit
。 Linux
系統(tǒng)中Unit
可以分為12種,列表如下:
uUnit | 說明 |
---|---|
Service Unit | 系統(tǒng)服務 |
Target Unit | 多個Unit構(gòu)成一個組 |
Device Unit | 硬件設備 |
Mount Unit | 文件系統(tǒng)的掛載點 |
Automount Unit | 自動掛載點 |
Path Unit | 文件或路徑 |
Scope Unit | 不是由systemd啟動的外部進程 |
Slice Unit | 進程組 |
Snapshot Unit | systemd快照,可以切回某個快照 |
Socket Unit | 進程間通信的socket |
Swap Unit | swap文件 |
Timer Unit | 定時器 |
用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
可以用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@rhel8.redhat.com status httpd.service
# 顯示某個 Unit 是否正在運行
$ systemctl is-active application.service
# 顯示某個 Unit 是否處于啟動失敗狀態(tài)
$ systemctl is-failed application.service
# 顯示某個 Unit 服務是否建立了啟動鏈接
$ systemctl is-enabled application.service
對一用戶來說,最常用的操作就是啟動或停止Unit
(主要是service
)。下面列出一常用的操作:
# 立即啟動一個服務
$ sudo systemctl start apache.service
# 立即停止一個服務
$ sudo systemctl stop apache.service
# 重啟一個服務
$ sudo systemctl restart apache.service
# 殺死一個服務的所有子進程
$ sudo systemctl kill apache.service
# 重新加載一個服務的配置文件
$ sudo systemctl reload apache.service
# 重載所有修改過的配置文件
$ sudo systemctl daemon-reload
# 顯示某個 Unit 的所有底層參數(shù)
$ systemctl show httpd.service
# 顯示某個 Unit 的指定屬性的值
$ systemctl show -p CPUShares httpd.service
# 設置某個 Unit 的指定屬性
$ sudo systemctl set-property httpd.service CPUShares=500
若Unit
之間存在依賴關系,比如A
依賴于B
,這意味著在systemd
啟動A
時,會同時去啟動B
??梢杂?code>$ systemctl list-dependencies命令列出一個Unit
的所有依賴,如下所示:
#列出藍牙服務的所有依賴資源
$ systemctl list-dependencies --all bluetooth.service
#-all參數(shù)用來展開target,若不想展開,則可去掉
4. Unit的配置文件
每個Unit
都有一個配置文件,告訴systemd
如何啟動這個Unit
。
systemd
默認從目錄/etc/systemd/system
中讀取配置文件,但這個目錄中大部分是軟鏈接文件,真正的配置文件存放在目錄/usr/lib/systemd/system/
中。
配置文件的后綴名,表明就是該Unit
的種類,若無后綴名,則用默認后綴名.service
。
可以用systemctl enable
或systemctl disable
命令在兩個目錄間建立或取消符號鏈接,如下示例:
#建立符號鏈接
$ sudo systemctl enable atd.service
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/atd.service' '/etc/systemd/system/atd.service'
#取消符號鏈接
$ sudo systemctl disable atd.service
可以用systemctl list-unit-files
命令列出所有的配置文件,如下圖所示:
可以看到每個配置文件的狀態(tài),其狀態(tài)含義如下:
- enabled:已建立啟動鏈接;
- disabled:未建立啟動鏈接;
- static:該配置文件沒有
install
部分,只能作為其它配置文件的依賴;
注意,僅從配置文件狀態(tài)還無法看出此Unit
是否正在運行,必須執(zhí)行systemctl status
命令才可以。
對于目錄下的配置文件,一旦修改,就必須讓systemd
重新加載配置文件,并重新啟動,否則修改不會生效,其操作步驟如下:
#如修改了httpd的配置文件,要先重載,再重啟
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service
配置文件就是普通的文本文件,可用systemctl cat
命令查看配置文件的內(nèi)容。 配置文件的完整字段清單可以參考官方文檔 。
5. Target
systemd
用target
代替了傳統(tǒng)init
啟動模式里面的運行級別的概念。每個target
中包含多個Unit
,這樣啟動某個target
就會啟動里面所有的Unit
,從這個意義上說,target
相當于一個“狀態(tài)點”,啟動某個target
就啟動至某種狀態(tài)。
注意,傳統(tǒng)的運行級別是互斥的,不可能多個RunLevel
同時啟動,但是多個target
可以同時啟動。其常用的幾個操作如下:
# 查看當前系統(tǒng)的所有 Target
$ systemctl list-unit-files --type=target
# 查看一個 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target
# 查看啟動時的默認 Target
$ systemctl get-default
# 設置啟動時的默認 Target
$ sudo systemctl set-default multi-user.target
# 切換 Target 時,默認不關閉前一個 Target 啟動的進程,
# systemctl isolate 命令改變這種行為,
# 關閉前一個 Target 里面所有不屬于后一個 Target 的進程
$ sudo systemctl isolate multi-user.target
target
與傳統(tǒng)RunLevel
的對應關系如下圖所示:
若想要將系統(tǒng)默認的運行目標修改為“多用戶無圖形”模式,可直接用符號即可,命令如下:
$ sudo ln -sf /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
6. 日志管理
systemd
統(tǒng)一管理所有Unit
的啟動日志,帶來的好處是,可以只用journalctl
一個命令查看所有日志(包括內(nèi)核日志和應用日志)。日志的配置文件是/etc/systemd/journald.conf
。
journalctl
的功能非常強大,其常用的操作如下示例:
# 查看所有日志(默認情況下 ,只保存本次啟動的日志)
$ sudo journalctl
# 查看內(nèi)核日志(不顯示應用日志)
$ sudo journalctl -k
# 查看系統(tǒng)本次啟動的日志
$ sudo journalctl -b
$ sudo journalctl -b -0
# 查看上一次啟動的日志(需更改設置)
$ sudo journalctl -b -1
# 查看指定時間的日志
$ sudo journalctl --since="2020-10-01 18:18:18"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2019-01-10" --until "2020-01-11 00:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"
# 顯示尾部的最新10行日志
$ sudo journalctl -n
# 顯示尾部指定行數(shù)的日志
$ sudo journalctl -n 20
# 實時滾動顯示最新日志
$ sudo journalctl -f
# 查看指定服務的日志
$ sudo journalctl /usr/lib/systemd/systemd
# 查看指定進程的日志
$ sudo journalctl _PID=1
# 查看某個路徑的腳本的日志
$ sudo journalctl /usr/bin/bash
# 查看指定用戶的日志
$ sudo journalctl _UID=33 --since today
# 查看某個 Unit 的日志
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today
# 實時滾動顯示某個 Unit 的最新日志
$ sudo journalctl -u nginx.service -f
# 合并顯示多個 Unit 的日志
$ journalctl -u nginx.service -u php-fpm.service --since today
# 查看指定優(yōu)先級(及其以上級別)的日志,共有8級
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b
# 日志默認分頁輸出,--no-pager 改為正常的標準輸出
$ sudo journalctl --no-pager
# 以 JSON 格式(單行)輸出
$ sudo journalctl -b -u nginx.service -o json
# 以 JSON 格式(多行)輸出,可讀性更好
$ sudo journalctl -b -u nginx.serviceqq
-o json-pretty
# 顯示日志占據(jù)的硬盤空間
$ sudo journalctl --disk-usage
# 指定日志文件占據(jù)的最大空間
$ sudo journalctl --vacuum-size=1G
# 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years
7.systemd應用操作實戰(zhàn)
若想設置某個服務在開機時啟動,可以輸入如下命令:
#設置開機啟動httpd.service
$ sudo systemctl enable httpd
設置開機啟動以后,服務并不會立即啟動,必須等下一次開機,如果現(xiàn)在就想運行此服務,可用:
$ sudo systemctl start httpd
執(zhí)行此命令后,服務也有可能啟動失敗,可用如下命令查看一下服務的狀態(tài):
$ sudo systemctl status httpd
若你想終止正在運行的服務,可以執(zhí)行如下命令:
$ sudo systemctl stop httpd.service
當然有時可能此命令沒有響應,服務也沒有停下來,這時候不得不殺進程了,可用如下命令:
$ sudo systemctl kill httpd.service
也可以重啟服務:文章來源:http://www.zghlxwxcb.cn/news/detail-823128.html
$sudo systemctl restart httpd.service
本文到此結(jié)束!下篇繼續(xù)!文章來源地址http://www.zghlxwxcb.cn/news/detail-823128.html
到了這里,關于Linux系統(tǒng)中的bash 進程和init進程還有systemd進程分別有什么作用,他們之間有什么聯(lián)系?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!