CentOS 6版本的系統服務是/etc/init.d啟動腳本的方式,CentOS 7采用強大的systemctl來管理系統服務,大幅提高了系統服務的運行效率,但是服務的配置和以前版本完全不同,這是很大的進步,systemctl太簡單易用了。
CentOS7添加自定義系統服務的步驟如下:
1)編寫自定義的系統服務腳本文件;
2)用systemctl命令把自定義的系統服務設置為開機/關機自啟動/停止。
本文以Oracle數據庫為例子來介紹添加自定義系統服務的知識。假設ORACLE_HOME環境變量的值是/oracle/home,各位根據自己的實際情況調整腳本的內容,把文中/oracle/home替換成您ORACLE_HOME的值。
一、編寫Oracle數據庫啟動/重啟/關閉的腳本
1、啟動Oracle數據庫的shell腳本
啟動Oracle數據庫的腳本為/oracle/home/bin/dbstart,內容如下:
sqlplus / as sysdba <<EOF
startup;
EOF
修改腳本的權限為可執行。
chmod +x /oracle/home/bin/dbstart
2、重啟Oracle數據庫的shell腳本
啟動Oracle數據庫的腳本為/oracle/home/bin/dbrestart,內容如下:
sqlplus / as sysdba <<EOF
shutdown immediate;
startup;
EOF
修改腳本的權限為可執行。
chmod +x /oracle/home/bin/dbrestart
3、關閉Oracle數據庫的shell腳本
啟動Oracle數據庫的腳本為/oracle/home/bin/dbshut,內容如下:
sqlplus / as sysdba <<EOF
shutdown immediate;
EOF
修改腳本的權限為可執行。
chmod +x /oracle/home/bin/dbshut
二、編寫自定義服務的配置文件
系統服務的啟動/重啟/停止由它的配置文件決定,本文把Oracle數據庫的系統服務命名為oracle.service。
創建服務配置文件/usr/lib/systemd/system/oracle.service,內容如下:
[Unit]
Description=Oracle RDBMS
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/su - oracle -c "/oracle/home/bin/dbstart >> /tmp/oracle.log"
ExecReload=/usr/bin/su - oracle -c "/oracle/home/bin/dbrestart >> /tmp/oracle.log"
ExecStop=/usr/bin/su - oracle -c "/oracle/home/bin/dbshut >> /tmp/oracle.log"
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
接下來介紹服務配置文件各部分的含義。
1、Unit部分
Unit部分是啟動順序與依賴關系。
[Unit]
Description=Oracle RDBMS
After=network.target
Description字段:給出當前服務的簡單描述。
Documentation字段:給出文檔位置。
After字段:表示本服務應該在某服務之后啟動。
Before字段:表示本服務應該在某服務之前啟動。
After和Before字段只涉及啟動順序,不涉及依賴關系。設置依賴關系,需要使用Wants字段和Requires字段。
Wants字段:表示本服務與某服務之間存在“依賴”系,如果被依賴的服務啟動失敗或停止運行,不影響本服務的繼續運行。
Requires字段,表示本服務與某服務之間存在“強依賴”系,如果被依賴的服務啟動失敗或停止運行,本服務也必須退出。
2、Service部分
Service部分定義如何啟動/重啟/停止服務。
[Service]
Type=simple
ExecStart=/usr/bin/su - oracle -c "/oracle/home/bin/dbstart >> /tmp/oracle.log"
ExecReload=/usr/bin/su - oracle -c "/oracle/home/bin/dbrestart >> /tmp/oracle.log"
ExecStop=/usr/bin/su - oracle -c "/oracle/home/bin/dbshut >> /tmp/oracle.log"
RemainAfterExit=yes
1)啟動類型(Type字段)
Type字段定義啟動類型。它可以設置的值如下。
simple(默認值):ExecStart字段啟動的進程為主進程。
forking:ExecStart字段將以fork()方式啟動,此時父進程將會退出,子進程將成為主進程。
oneshot:類似於simple,但只執行一次,Systemd會等它執行完,才啟動其他服務。
dbus:類似於simple,但會等待D-Bus信號后啟動。
notify:類似於simple,啟動結束后會發出通知信號,然后Systemd再啟動其他服務。
idle:類似於simple,但是要等到其他任務都執行完,才會啟動該服務。
2)啟動服務(ExecStart字段)
啟動服務時執行的命令,可以是可執行程序、系統命令或shell腳本。
3)重啟服務(ExecReload字段)
重啟服務時執行的命令,可以是可執行程序、系統命令或shell腳本。
4)停止服務(ExecStop字段)
停止服務時執行的命令,可以是可執行程序、系統命令或shell腳本。
5)如果RemainAfterExit字段設為yes,表示進程退出以后,服務仍然保持執行。
6)服務配置文件還可以讀取環境變量參數文件,我個人認為比較麻煩,沒有必要,就不介紹了,設置程序的環境變量有很多種方法,可以在腳本中配置,也可以用“su
–”的方法。
3、Install部分
Install部分定義如何安裝這個配置文件,即怎樣做到開機啟動。
[Install]
WantedBy=multi-user.target
WantedBy字段:表示該服務所在的Target。
Target的含義是服務組,表示一組服務。WantedBy=multi-user.target指的是,oracle所在的Target是multi-user.target(多用戶模式)。
這個設置非常重要,因為執行systemctl enable
oracle.service命令時,oracle.service會被鏈接到/etc/systemd/system/multi-user.target.wants目錄之中,實現開機啟動的功能。
4、重啟行為
Service部分還有一些字段,定義了重啟行為。
1)KillMode字段
KillMode字段定義Systemd如何停止sshd服務,可以設置的值如下:
control-group(默認值):當前控制組里面的所有子進程,都會被殺掉。
process:只殺主進程。
mixed:主進程將收到SIGTERM信號,子進程收到SIGKILL信號。
none:沒有進程會被殺掉,只是執行服務的stop命令。
2)Restart字段
Restart字段定義了服務程序退出后,Systemd的重啟方式,可以設置的值如下:
no(默認值):退出后不會重啟。
on-success:只有正常退出時(退出狀態碼為0),才會重啟。
on-failure:非正常退出時(退出狀態碼非0),包括被信號終止和超時,才會重啟。
on-abnormal:只有被信號終止和超時,才會重啟。
on-abort:只有在收到沒有捕捉到的信號終止時,才會重啟。
on-watchdog:超時退出,才會重啟。
always:不管是什么退出原因,總是重啟。
3)RestartSec字段。
RestartSec字段:表示Systemd重啟服務之前,需要等待的秒數。
三、使用自定義的服務
1、重新加載服務配置文件
每次修改了服務配置文件后,需要執行以下命令重新加載服務的配置文件。
systemctl daemon-reload
2、啟動/停止/啟重oracle服務
systemctl start oracle # 啟動oracle服務。
systemctl restart oracle # 重啟oracle服務。
systemctl stop oracle # 關閉oracle服務。
3、把oracle服務設置為開機/關機自啟動/停止
systemctl is-enabled oracle # 查看oracle服務是否是開機自啟動。
systemctl enable oracle # 把oracle服務設置為開機自啟動。
4、查看Oracle實例啟動/停止的日志
Oracle實例啟動的日志在/tmp/oracle.log文件中。
注意,只有通過systemctl啟動/關閉Oracle實例和監聽才會寫日志,手工執行腳本不寫日志。
四、版權聲明
C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道