【Linux 系统】关于守护进程
一 背景
常駐進程,其實就是守護進程。在某家公司工作期間,會使用它來作為需要保活運行的機制,用以維護消費者進程。但當時對于守護進程的理解還是不夠深入,所以現在再把這塊做個整理,并結合當時遇到的一個問題實例進行分析。注:下面內容都針對Linux操作系統。(Mac上的launchd與systemd作用相同,而且據說systemd的很多概念來自launched)。
二 守護進程
2.1 init.d
歷史上,Linux 的啟動一直采用init進程來啟動服務。例如:
service apache2 start
sudo /etc/init.d/apache2 start
/etc/init.d 是 /etc/rc.d/init.d 的軟鏈接(soft link)。可以通過 ll 命令查看。
ls -ld /etc/init.d
lrwxrwxrwx. 1 root root 11 Aug 30 2015 /etc/init.d -> rc.d/init.d
/etc/init.d是用來放服務腳本的,當Linux啟動時,會尋找這些目錄中的服務腳本,并根據腳本的run level確定不同的啟動級別。例如,某臺測試機上的/etc/init.d目錄下的內容如下:
2.2 systemd
2.2.1 init缺陷
init方法啟動服務有兩個缺陷:
1、啟動時間長。init進程是串行執行,在一個進程啟動完畢后,才能啟動下一個進程
2、啟動腳本復雜。init進程只負責執行啟動腳本,腳本自身需要處理各種異常情況,這使得腳本內容過長且不易控制。
因此,就有了systemd的誕生。
2.2.2 systemd概述
關于systemd可以查看freedesktop的這篇文獻:systemd System and Service Manager。
簡單描述如下:systemd是Linux系統的一套基本構建塊。它提供了一個系統和服務管理器,它作為PID 1運行并啟動系統的其余部分。
system的命令位置和版本查看:
[xxx@wx-crm1 ~]$ systemctl --version
systemd 219
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN
[xxx@wx-crm1 ~]$ which systemctl
/usr/bin/systemctl
Systemd 的優點是功能強大,使用方便,缺點是體系龐大,非常復雜。事實上,現在還有很多人反對使用 Systemd,理由就是它過于復雜,與操作系統的其他部分強耦合,違反"keep simple, keep stupid"的Unix 哲學。
相關爭議內容鏈接:
Solidot | systemd作者抨擊開源和Linux社區
Solidot | 抗議者創建Systemd分支Uselessd
2.2.3 systemd架構
2.2.4 systemd相關命令
systemctl是systemd的主命令,提供的主要功能和使用方式如下:
# 重啟系統$ sudo systemctl reboot# 關閉系統,切斷電源$ sudo systemctl poweroff# CPU停止工作$ sudo systemctl halt# 暫停系統$ sudo systemctl suspend# 讓系統進入冬眠狀態$ sudo systemctl hibernate除此之外,還有systemd-analyze,用語查看啟動耗時;# 查看啟動耗時$ systemd-analyze# 查看每個服務的啟動耗時$ systemd-analyze blame# 顯示瀑布狀的啟動過程流$ systemd-analyze critical-chain# 顯示指定服務的啟動流$ systemd-analyze critical-chain atd.servicehostnamectl命令用于查看當前主機的信息
localectl命令用于控制系統區域設置和鍵盤布局設置
timedatectl命令用于查看當前時區設置。
loginctl命令用于查看當前登錄的用戶,等等。
2.2.5 相關概念
1、單元
系統初始化需要做的事情較多,例如啟動sshd,需要做很多配置工作。這個過程中的每一步將會被抽象為一個配置單元 unit。通常可以認為一個服務是一個配置單元,一個掛載點是一個配置單元,一個交換分區的配置是一個配置單元等。
通過這樣的抽象,可以簡化文件開發,例如一個mysql服務對應一個mysql.server文件,這種配置會非常簡單,我們也不再需要編寫和維護復雜的系統5腳本了。
2、依賴關系
systemd已經將大量的啟動工作解除了依賴,使得他們可以并發啟動,但還有有些任務之間存在依賴關系。systemd用配置單元定義文件中的關鍵字來描述配置單元之間的依賴關系。比如unit A依賴unit B,可以再unit B的定義中用"require A"來表示,這樣systemd會保證優先啟動A,然后再啟動B。
3、事務
這里的事務,與數據庫中事務的概念有所不同,是為了保證多個依賴的配置單元之間沒有環形引用。比如有A,B,C三個單元,存在環形依賴關系:
如果存在這一的依賴,那么將無法啟動任意一個服務。systemd會嘗試通過依賴關系的強(required)和弱(want)的分別,通過去掉wants關鍵字指定的依賴來嘗試打破循環,無法修復的話將會報錯。
4、target和運行級別
systemd用target取代了運行級別的概念。systemd下目標和常見runlevelt的對應關系如下:
2.2.6 systemd的并發啟動原理
主要有三種方式:解決 socket 依賴;解決D-Bus依賴,即desktop-bus依賴,是一種進程間通信機制;解決文件系統依賴。詳細解釋請查閱參考文獻1.
三 小結
本章描述systemd的起源及主要概念,并列舉了一些參考文獻。在下一篇文章,將介紹我們之前項目中的一種使用方式,和遇到的問題及解決過程。
參考文章
淺析 Linux 初始化 init 系統,第 3 部分 systemd
阮一峰,Systemd 入門教程:命令篇
Linux守護進程之systemd
?
關注infoq、微信公眾號:程序員架構進階,實時獲取最新文章內容,歡迎您的光臨。
總結
以上是生活随笔為你收集整理的【Linux 系统】关于守护进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统安装Zookeeper
- 下一篇: linux系统下c 开发视频教程,【C/