CentOS7添加自定義系統服務



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

作者:碼農有道


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM