首頁 > 軟體

systemd - CentOS 7進程守護&監控

2020-06-16 17:23:10

需求:

執行環境為CentOS 7系統,我們開發了一個程式,需要在開機時啟動它,當程式進程crash之後,守護行程立即拉起進程。

解決方案:

使用CentOS 7中的init進程systemd

systemd簡介

Linux Init & CentOS systemd

Linux一直以來採用init進程。例如下面的命令用來啟動服務:
$ sudo /etc/init.d/apache2 start
或者 $ service apache2 start

但是init有兩個缺點:
1、啟動時間長。Init進程是序列啟動,只有前一個進程啟動完,才會啟動下一個進程。(這也是CentOS5的主要特徵)
2、啟動指令碼複雜。Init進程只是執行啟動指令碼,不管其他事情。指令碼需要自己處理各種情況,這使得指令碼變得很長而且複雜。

Init:
Centos 5 Sys init 是啟動速度最慢的,序列啟動過程,無論進程相互之間有無依賴關係。
Centos6 Upstart init 相對啟動速度快一點有所改進。有依賴的進程之間依次啟動而其他與之沒有依賴關係的則並行同步啟動。
Centos7 systemd 與以上都不同。所有進程無論有無依賴關係則都是並行啟動(當然很多時候進程沒有真正啟動而是只有一個信號或者說是標記而已,在真正利用的時候才會真正啟動。)

systemd為了解決上文的問題而誕生。它的目標是,為系統的啟動和管理提供一套完整的解決方案。根據linux慣例,字母d是守護行程(daemon) 的縮寫。Systemd名字的含義就是 守護整個系統。Centos 7裡systemd代替了init,成為了系統的第一個進程。PID為1.其他所有的進程都是它的子進程。

systemd 是 Linux 下的一款系統和服務管理器,相容 SysV 和 LSB 的啟動指令碼。systemd 的特性有:支援並行化任務;同時採用 socket 式與 D-Bus 匯流排式啟用服務;按需啟動守護行程(daemon);利用 Linux 的 cgroups 監視進程;支援快照和系統恢復;維護掛載點和自動掛載點;各服務間基於依賴關係進行精密控制。

使用demo

Step1. 建立被監控指令碼

$ cd ~
$ vim test_init_watch.sh

//間隔一秒鐘輸出一個date時間戳到指定到指定檔案
//test_init_watch.sh

#!/bin/bash

while [ 1 ]
do
    echo `date` >> /home/cooper/log.txt
    sleep 1
done

$ chmod 777 test_init_watch.sh

//建立軟連結
$ sudo cd /usr/sbin/sysd-test
$ ln -sf /home/cooper/test_init_watch.sh sysd-test

Step2. 建立服務檔案,設定init進程託管

//systemd服務檔案放置目錄有系統和使用者區分;系統(/usr/lib/systemd/system/)、使用者(/usr/lib/systemd/user/)。
//放置在系統目錄中在開機中沒有登陸情況下就能執行的程式;反之則放在使用者目錄中

$ cd /usr/lib/systemd/system/sysd-test.service
$ cp sshd.service sysd-test.service //借鑒sshd.service
$ vim sysd-test.service

//sysd-test.service

[Unit]
Description=sysd server daemon
Documentation=no
After=no
Wants=no

[Service]
EnvironmentFile=no
ExecStart=/usr/sbin/sysd-test
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=1s

[Install]
WantedBy=multi-user.target graphic.target      #相當於runlevel:2345

// 啟用開機啟動。啟用runlevel的2345級別
$ systemctl enable sysd-test.service
//等價於建立軟連結
$ cd /etc/systemd/system/multi-user.target.wants
$ ln -sf /usr/lib/systemd/system/sysd-test.service sysd-test.service
$ cd /usr/lib/systemd/system/graphical.target.wants/
$ ln -sf /usr/lib/systemd/system/sysd-test.service sysd-test.service

Step3. 啟動sysd_test

//使用命令:systemctl [start|stop|status|reload|kill] sysd-test.service

//啟動
$ systemctl start sysd-test.service
$ pgrep sysd-test
$ pkill -9 sysd-test
$ pgrep sysd-test //會發現兩次pgrep進程id不一樣了,表示系統自動拉起了sysd-test

//停止
$ systemctl stop sysd-test.service

CentOS7進程管理systemd詳解  http://www.linuxidc.com/Linux/2016-09/135464.htm

CentOS7/RHEL7 systemd詳解   http://www.linuxidc.com/Linux/2015-04/115937.htm

為什麼systemd會被如此迅速的採用? http://www.linuxidc.com/Linux/2014-08/105789.htm

systemd 與 sysVinit 彩版對照表 http://www.linuxidc.com/Linux/2014-09/106455.htm

太有用了!用systemd命令來管理Linux系統!  http://www.linuxidc.com/Linux/2014-09/106490.htm

淺析 Linux 初始化 init 系統,第 3 部分: Systemd  http://www.linuxidc.com/Linux/2014-12/110383.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-01/139802.htm


IT145.com E-mail:sddin#qq.com