一、CentOS7添加自定義腳本服務說明
在CentOS7下,已經不再使用chkconfig命令管理系統開機自啟動服務和條件自定義腳本服務了,而是使用管理unit的方式來控制開機自啟動服務和添加自定義腳本服務。在/usr/lib/systemd/system目錄下包含了各種unit文件,有service后綴的服務unit,有target后綴的開機級別unit等。這里介紹自定義腳本服務,如果想把自定義的腳本變成服務進程,都需要寫對應的service配置文件,這樣才能被unit所管理(注意:自定義開機自啟動服務的.service配置文件必須放在/usr/lib/systemd/system這個目錄下面)。服務類別又分為服務又分為系統服務(system)和用戶服務(user)。
系統服務:開機不登陸就能運行的程序(常用於開機自啟)。
用戶服務:需要登陸以后才能運行的程序。
二、編寫.service配置文件說明
1、[unit]區塊:設置管理啟動順序與依賴關系
Description=服務描述 | 給出當前服務的簡單描述 |
Documentation=路徑或url | 給出文檔位置 |
After=服務.target或服務.service | 定義在某些服務之后啟動。例如sshd服務啟動必須在network.target sshd-keygen.service服務開啟之后才能啟動,可以使用如下命令查看sshd服務的配置 cat /usr/lib/systemd/system/sshd.service |
Before=服務.target | 定義在某些服務之前啟動 |
Wants=服務.service | 弱依賴,表示等號填寫服務啟動或失敗,不影響此配置文件服務的啟動 |
Requires=服務.service | 強依賴,表示等號填寫服務啟動或失敗,那么此配置文件的服務將啟動失敗 |
注意:如果After、Before、Wants、Requires等號后面需要填寫多個服務可以用空格隔開。After和Before字段只涉及啟動順序,不涉及依賴關系。Wants字段與Requires字段只涉及依賴關系,與啟動順序無關,默認情況下是同時啟動的。
2、[Service]區塊:設置啟動行為
•啟動命令
ExecStart=命令 | 定義啟動進程時執行的命令 |
ExecReload=命令 | 重啟服務時執行的命令 |
ExecStop=命令 | 停止服務時執行的命令 |
ExecStartPre=命令 | 啟動服務之前執行的命令 |
ExecStartPost=命令 | 啟動服務之后執行的命令 |
ExecStopPost=命令 | 停止服務之后執行的命令 |
所有的啟動設置之前,都可以加上一個連詞號(-),表示"抑制錯誤",即發生錯誤的時候,不影響其他命令的執行。例如:ExecStop=-/bin/sh /server/scripts/xx.sh
•啟動類型 Type字段定義啟動類型。它可以設置的值如下:
simple(默認值) | ExecStart字段啟動的進程為主進程 |
forking | ExecStart字段將以fork()方式啟動,此時父進程將會退出,子進程將成為主進程(后台運行) |
oneshot | 類似於simple,但只執行一次,Systemd 會等它執行完,才啟動其他服務 |
dbus | 類似於simple,但會等待 D-Bus 信號后啟動 |
notify | 類似於simple,啟動結束后會發出通知信號,然后 Systemd 再啟動其他服務 |
idl | 類似於simple,但是要等到其他任務都執行完,才會啟動該服務。一種使用場合是為讓該服務的輸出,不與其他服務的輸出相混合 |
•重啟行為
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
3、[Install]區塊:定義如何安裝這個配置文件,即怎樣做到開機啟動
這個設置非常重要,如果設置開機自啟動,在/etc/systemd/system目錄下面的multi-user.target.wants子目錄之中機會創建一個服務的軟鏈接
WantedBy字段,表示該服務所在的 Targe,target的含義是服務組,表示一組服務,它可以設置的值如下
multi-user.target | 表示多用戶命令行狀態 |
graphical.target | 表示圖形用戶狀態,它依賴於multi-user.target |
三、注冊服務實例
配置文件目錄
systemctl腳本目錄 | /usr/lib/systemd/ |
系統服務目錄 | /usr/lib/systemd/system/ |
用戶服務目錄 | /usr/lib/systemd/system/ |
四、配置一個自定義腳本服務
這里寫一個rsync+inotify的腳本服務(注意:此腳本是在centos6直接拿過來用的,在centos6可以直接使用chkconfig管理,這里只是測試,勿噴)
1、創建腳本目錄(為什么不要centos自帶的腳本目錄呢?這是為了方便管理)
mkidr -p /server/scripts/sync.sh
vim /server/scripts/sync.sh
2、腳本代碼
#!/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
3、添加注冊腳本服務文件(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
4、運行systemctl start syncd命令啟動服務