常駐程序,其實就是守護程序。在某家公司工作期間,會使用它來作為需要保活執行的機制,用以維護消費者程序。但當時對於守護程序的理解還是不夠深入,所以現在再把這塊做個整理,並結合當時遇到的乙個問題例項進行分析。注:下面內容都針對linux作業系統。(mac上的launchd與systemd作用相同,而且據說systemd的很多概念來自launched)。
歷史上,linux 的啟動一直採用init程序來啟動服務。例如:
service apache2 startsudo /etc/init.d/apache2 start
/etc/init.d 是 /etc/rc.d/init.d 的軟鏈結(soft link)。可以通過 ll 命令檢視。
ls -ld /etc/init.dlrwxrwxrwx. 1 root root 11 aug 30 2015 /etc/init.d -> rc.d/init.d
/etc/init.d是用來放服務指令碼的,當linux啟動時,會尋找這些目錄中的服務指令碼,並根據指令碼的run level確定不同的啟動級別。例如,某台測試機上的/etc/init.d目錄下的內容如下:
init方法啟動服務有兩個缺陷:
1、啟動時間長。init程序是序列執行,在乙個程序啟動完畢後,才能啟動下乙個程序
2、啟動指令碼複雜。init程序只負責執行啟動指令碼,指令碼自身需要處理各種異常情況,這使得指令碼內容過長且不易控制。
因此,就有了systemd的誕生。
關於systemd可以檢視freedesktop的這篇文獻:systemd system and service manager。
簡單描述如下:systemd是linux系統的一套基本構建塊。它提供了乙個系統和服務管理器,它作為pid 1執行並啟動系統的其餘部分。
system的命令位置和版本檢視:
[***@wx-crm1 ~]$ systemctl --versionsystemd 219
[***@wx-crm1 ~]$ which systemctl
/usr/bin/systemctl
systemd 的優點是功能強大,使用方便,缺點是體系龐大,非常複雜。事實上,現在還有很多人反對使用 systemd,理由就是它過於複雜,與作業系統的其他部分強耦合,違反"keep ******, keep stupid"的unix 哲學。
solidot | systemd作者抨擊開源和linux社群
solidot | **者建立systemd分支uselessd
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.service
hostnamectl命令用於檢視當前主機的資訊
localectl命令用於控制系統區域設定和鍵盤布局設定
timedatectl命令用於檢視當前時區設定。
loginctl命令用於檢視當前登入的使用者,等等。
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的對應關係如下:
** linux 初始化 init 系統,第 3 部分 systemd
阮一峰,systemd 入門教程:命令篇
linux守護程序之systemd
Linux 系統 守護程序
吳巨集東 記於2018年07月11日 部落格 守護程序 daemon 是指linux系統上各種執行在後台提供各種服務的程序 系統初始化程序演變是由sysvinit到rhel centos6的upstart再到現在rhel centos7的systemd 管理主要是通過命令systemctl來顯示 啟...
Linux守護程序
linux下守護程序一般分為5步,但是實際上只有前兩步是關鍵。第一步 建立子程序,關閉父程序。使用fork 建立,父程序exit 退出。關鍵第二步 建立新的會話id,setsid 作用是使子程序擺脫原有的會話 程序組 終端的控制,其實,linux下每個程序都是由一號程序建立而來的,每個程序都是1號程...
Linux 守護程序
守護程序daemon,是生存期較長的一種程序,名字一般以字母d結尾。它們常常在系統自舉時啟動,僅在系統關閉時才終止。因為它們沒有控制終端,所以說它們是在後台執行的。linux系統有很多守護程序,它們執行日常事務活動。自舉只有兩個功能 加電自檢和磁碟引導。加電自檢 當我們按下計算機電源開關時,頭幾秒鐘...