歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> systemd - CentOS 7進程守護&監控

systemd - CentOS 7進程守護&監控

日期:2017/2/28 13:44:25   编辑:Linux教程

需求:

運行環境為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

Copyright © Linux教程網 All Rights Reserved