CentOS7添加自定義腳本服務

1、CentOS7添加自定義腳本服務說明

在CentOS7下,已經再也不使用chkconfig命令管理系統開機自啓動服務和條件自定義腳本服務了,而是使用管理unit的方式來控制開機自啓動服務和添加自定義腳本服務。在/usr/lib/systemd/system目錄下包含了各類unit文件,有service後綴的服務unit,有target後綴的開機級別unit等。這裏介紹自定義腳本服務,若是想把自定義的腳本變成服務進程,都須要寫對應的service配置文件,這樣才能被unit所管理(注意:自定義開機自啓動服務的.service配置文件必須放在/usr/lib/systemd/system這個目錄下面)。服務類別又分爲服務又分爲系統服務(system)和用戶服務(user)。html

系統服務:開機不登錄就能運行的程序(經常使用於開機自啓)。vim

用戶服務:須要登錄之後才能運行的程序。centos

2、編寫.service配置文件說明

一、[unit]區塊:設置管理啓動順序與依賴關係

Description=服務描述 給出當前服務的簡單描述                                              
Documentation=路徑或url 給出文檔位置
After=服務.target或服務.service           

定義在某些服務以後啓動。例如sshd服務啓動必須在network.target sshd-keygen.service服務開啓以後才能啓動,可使用以下命令查看sshd服務的配置bash

cat  /usr/lib/systemd/system/sshd.servicessh

Before=服務.target 定義在某些服務以前啓動
Wants=服務.service 弱依賴,表示等號填寫服務啓動或失敗,不影響此配置文件服務的啓動
Requires=服務.service 強依賴,表示等號填寫服務啓動或失敗,那麼此配置文件的服務將啓動失敗

注意:若是After、Before、Wants、Requires等號後面須要填寫多個服務能夠用空格隔開。After和Before字段只涉及啓動順序,不涉及依賴關係。Wants字段與Requires字段只涉及依賴關係,與啓動順序無關,默認狀況下是同時啓動的。ide

二、[Service]區塊:設置啓動行爲

 •啓動命令測試

ExecStart=命令 定義啓動進程時執行的命令
ExecReload=命令 重啓服務時執行的命令                                                                                                                                                         
ExecStop=命令 中止服務時執行的命令
ExecStartPre=命令 啓動服務以前執行的命令
ExecStartPost=命令 啓動服務以後執行的命令
ExecStopPost=命令 中止服務以後執行的命令

全部的啓動設置以前,均可以加上一個連詞號(-),表示"抑制錯誤",即發生錯誤的時候,不影響其餘命令的執行。例如:ExecStop=-/bin/sh /server/scripts/xx.shui

•啓動類型  Type字段定義啓動類型。它能夠設置的值以下:url

simple(默認值) ExecStart字段啓動的進程爲主進程
forking ExecStart字段將以fork()方式啓動,此時父進程將會退出,子進程將成爲主進程(後臺運行)
oneshot 相似於simple,但只執行一次,Systemd 會等它執行完,才啓動其餘服務
dbus 相似於simple,但會等待 D-Bus 信號後啓動
notify 相似於simple,啓動結束後會發出通知信號,而後 Systemd 再啓動其餘服務
idl 相似於simple,可是要等到其餘任務都執行完,纔會啓動該服務。一種使用場合是爲讓該服務的輸出,不與其餘服務的輸出相混合

•重啓行爲 spa

KillMode字段,定義Systemd如何中止服務,它能夠設置的值以下

control-group(默認值) 當前控制組裏面的全部子進程,都會被殺掉
process 只殺主進程
mixed 主進程將收到 SIGTERM 信號,子進程收到 SIGKILL 信號
none 沒有進程會被殺掉,只是執行服務的 stop 命令

Restart字段,定義了服務退出後,Systemd的重啓方式,它能夠設置的值以下

no(默認值) 退出後不會重啓
on-success 只有正常退出時(退出狀態碼爲0),纔會重啓
on-failure 非正常退出時(退出狀態碼非0),包括被信號終止和超時,纔會重啓
on-abnormal 只有被信號終止和超時,纔會重啓
on-abort 只有在收到沒有捕捉到的信號終止時,纔會重啓
on-watchdog 超時退出,纔會重啓
always 不論是什麼退出緣由,老是重啓

•service區塊的其餘一些字段

EnvironmentFile=文件路徑 指定當前服務的環境參數文件
RestartSec=數值 表示Systemd重啓服務以前,須要等待的秒數
PIDFile=PID文件路徑 PID進程文件
KillSignal=信號量 中止信號量,值通常爲SIGQUIT
TimeoutStopSec=數值 中止超時時間
PrivateTmp=布爾值 獨立空間true或false,即文件系統名字空間的配置將被該命令行啓動的進程忽略

 更多配置詳解點擊:http://www.jinbuguo.com/systemd/systemd.service.html

三、[Install]區塊:定義如何安裝這個配置文件,即怎樣作到開機啓動

這個設置很是重要,若是設置開機自啓動,在/etc/systemd/system目錄下面的multi-user.target.wants子目錄之中機會建立一個服務的軟連接

WantedBy字段,表示該服務所在的 Targe,target的含義是服務組,表示一組服務,它能夠設置的值以下

multi-user.target 表示多用戶命令行狀態
graphical.target 表示圖形用戶狀態,它依賴於multi-user.target                                                                                                 

3、註冊服務實例

配置文件目錄

systemctl腳本目錄 /usr/lib/systemd/ 
系統服務目錄 /usr/lib/systemd/system/ 
用戶服務目錄 /usr/lib/systemd/system/

4、配置一個自定義腳本服務

 這裏寫一個rsync+inotify的腳本服務(注意:此腳本是在centos6直接拿過來用的,在centos6能夠直接使用chkconfig管理,這裏只是測試,勿噴)

一、建立腳本目錄(爲何不要centos自帶的腳本目錄呢?這是爲了方便管理)

mkidr -p /server/scripts/sync.sh
vim /server/scripts/sync.sh

二、腳本代碼

#!/bin/bash
#chkconfig: 2345 38 46

. /etc/init.d/functions
if [ $# -ne 1 ]
then
 echo "usage: $0 {start|stop|status}"
 exit 1
fi
case "$1" in
start)
 if [ -e "/var/run/inotify.pid" ]
 then
    action "inotify service start fail" /bin/false
    echo "sync server is running......"
    sleep 1
    exit 1
 fi
 /bin/bash /server/scripts/inotify.sh &
 `ps -ef|grep "inotifywait"|grep -v "grep"|awk '{print $2}'` >/var/run/inotify.pid
 if [ `ps -ef|grep inotify|wc -l` -gt 2 ]
 then
    action "inotify service is started" /bin/true
 else
    action "inotify service is started" /bin/false
 fi
 ;;
stop)
 if [ `ps -ef|grep inotify|grep -v grep|wc -l` -a -e "/var/run/inotify.pid" ]
 then
    rm -f /var/run/inotify.pid >/dev/null 2>&1
    pkill inotifywait
 else
    action "inotify service stop fail" /bin/false
    echo "sync server is not running"
    sleep 1
    exit 1
 fi
 sleep 1
 if [ `ps -ef|grep inotify|grep -v grep|wc -l` -eq 0 -a ! -e "/var/run/inotify.pid" ]
 then
    action "inotify service is stoped" /bin/true
 else
    action "inotify service is stoped" /bin/false
 fi
 ;;
status)
 if [ `ps -ef|grep inotify|wc -l` -gt 2 ]
 then
    action "inotify service is running"
 else
    action "inotify service is stoped"
 fi
 ;;
*)
 echo "usage: $0 {start|stop|status}"
 exit 1
esac
View Code

三、添加註冊腳本服務文件(vim /usr/lib/systemd/system/syncd.service),文件內容以下

[Unit]
Description="這是rsync+inotify實時同步服務"
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/bin/sh /server/scripts/sync.sh start
ExecReload=/bin/sh /server/scripts/sync.sh restart
ExecStop=/bin/sh /server/scripts/sync.sh stop
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target

四、運行systemctl start syncd命令啓動服務

相關文章
相關標籤/搜索