原文: https://www.cnblogs.com/sunsky303/p/11243927.html
需求:
運行環境為CentOS 7系統,我們開發了一個程序,需要在開機時啟動它,當程序進程crash或者開機之后,守護進程立即拉起進程。
解決方案:
使用CentOS 7中的init進程systemd
systemd簡介
Linux Init & CentOS systemd
Linux一直以來采用init進程。例如下面的命令用來啟動服務:
sudo/etc/init.d/apache2start或者 sudo/etc/init.d/apache2start或者 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時間戳到指定到指定文件
#!/bin/bash # test_init_watch.sh while [ 1 ] do echo `date` >> /home/cooper/log.txt sleep 1 done
$ chmod 777 test_init_watch.sh
//創建軟鏈接/home/cooper/test_init_watch.sh =>/usr/sbin/sysd-test
$ sudo cd /usr/sbin $ ln -sf /home/cooper/test_init_watch.sh sysd-test
Step2. 創建服務文件,設置init進程托管
注意:
- systemd服務文件放置目錄有系統和用戶區分;系統(/usr/lib/systemd/system/)、用戶(/usr/lib/systemd/user/)。
- 在開機中沒有登陸情況下就能運行的程序,應該放置在系統目錄中;反之則放在用戶目錄中
//為了測試方便,把服務文件放在/usr/lib/systemd/system中(借鑒sshd.service):
$ cd /usr/lib/systemd/system/sysd-test.service $ cp sshd.service sysd-test.service $ vim sysd-test.service
// usr/lib/systemd/system/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