天天看點

centos7 system自定義服務

1.介紹

  • centos中service指令與/etc/init.d的關系

  service httpd start 其實是啟動了存放在/etc/init.d目錄下的腳本。

  但是centos7的服務管理改規則了。CentOS 7繼承了RHEL 7的新的特性,例如強大的systemctl,而systemctl的使用也使得以往系統服務的/etc/init.d的啟動腳本的方式就此改變,也大幅提高了系統服務的運作效率。但服務的配置和以往也發生了極大的不同,

說實在的,變的簡單而易用了許多。

  CentOS 7的服務systemctl腳本存放在:/usr/lib/systemd/,有系統(system)和使用者(user)之分,像需要開機不登陸就能運作的程式,還是存在系統服務裡吧,即:/usr/lib/systemd/system目錄下每一個服務以.service結尾,一般會分為3部分:[Unit]、[Service]和[Install]

2.示例

  這裡以Mongo腳本示例,Mongo腳本由于自定義,本人有很多參數沒有寫,但是以下面示例的參數,足夠控制服務了。

[root@CentOS7 system]# cat /usr/lib/systemd/system/mongod.service 
[Unit]
Description=mongo
After=network.target 
 
[Service]
Type=forking
PIDFile=/usr/local/mongodb/tmp/mongod.pid
ExecStart=/usr/local/mongodb/bin/mongod -f /etc/mongod.conf.bak
ExecReload=/bin/kill -s HUP $MAINPID      #停止與重載寫不寫無所謂
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target      

3.服務參數

3.1 [Unit]

Description : 服務的簡單描述

Documentation : 服務文檔

Before, After:定義啟動順序,Before=xxx.service,代表本服務在xxx.service啟動之前啟動。After=xxx.service,代表本服務在xxx之後啟動。

Requires: 這個單元啟動了,那麼它“需要”的單元也會被啟動; 它“需要”的單元被停止了,它自己也活不了。但是請注意,這個設定并不能控制某單元與它“需要”的單元的啟動順序(啟動順序是另外控制的),即 Systemd 不是先啟動 Requires 再啟動本單元,而是在本單元被激活時,并行啟動兩者。于是會産生争分奪秒的問題,如果 Requires 先啟動成功,那麼皆大歡喜; 如果 Requires 啟動得慢,那本單元就會失敗(Systemd 沒有自動重試)。是以為了系統的健壯性,不建議使用這個标記,而建議使用 Wants 标記。可以使用多個 Requires。

RequiresOverridable:跟 Requires 很像。但是如果這條服務是由使用者手動啟動的,那麼

RequiresOverridable 後面的服務即使啟動不成功也不報錯。跟 Requires 比增加了一定容錯性,但是你要确定你的服務是有等待功能的。另外,如果不由使用者手動啟動而是随系統開機啟動,那麼依然會有 Requires 面臨的問題。

Requisite:強勢版本的 Requires。要是這裡需要的服務啟動不成功,那本單元檔案不管能不能檢測等不能等待都立刻就會失敗。

Wants:推薦使用。本單元啟動了,它“想要”的單元也會被啟動。但是啟動不成功,對本單元沒有影響。

Conflicts:一個單元的啟動會停止與它“沖突”的單元,反之亦然。

3.2

[Service]

Type :

啟動類型simple、forking、oneshot、notify、dbus

  • Type=simple(預設值):systemd認為該服務将立即啟動。服務程序不會fork。如果該服務要啟動其他服務,不要使用此類型啟動,除非該服務是socket激活型。
  • Type=forking:systemd認為當該服務程序fork,且父程序退出後服務啟動成功。對于正常的守護程序(daemon),除非你确定此啟動方式無法滿足需求,使用此類型啟動即可。使用此啟動類型應同時指定 PIDFile=,以便systemd能夠跟蹤服務的主程序。
  • Type=oneshot:這一選項适用于隻執行一項任務、随後立即退出的服務。可能需要同時設定 RemainAfterExit=yes 使得 systemd 在服務程序退出之後仍然認為服務處于激活狀态。(簡單來說服務類型就是啟動,完成,沒程序了。)
  • Type=notify:與 Type=simple 相同,但約定服務會在就緒後向 systemd 發送一個信号。這一通知的實作由 libsystemd-daemon.so 提供。 Type=dbus:若以此方式啟動,當指定的 BusName 出現在DBus系統總線上時,systemd認為服務就緒。

PIDFile : pid檔案路徑, pid檔案,沒有可以删除這行

ExecStartPre :啟動前要做什麼,比如是測試配置檔案

ExecStart:啟動 

  • --如果你服務的類型不是 oneshot,那麼它隻可以接受一個指令,參數不限。
  • --多個指令用分号隔開,多行用 \ 跨行。

ExecReload:重載 

ExecStop:停止 

Restart:定義服務何種情況下重新開機(啟動失敗,啟動逾時,程序被終結)。可選選項:no, on-success, on-failure,on-watchdog, on-abort

SuccessExitStatus:參考ExecStart中傳回值,定義何種情況算是啟動成功。eg:SuccessExitStatus=1 2 8 SIGKILL

PrivateTmp:True表示給服務配置設定獨立的臨時空間

Environment='JAVA_HOME=/usr/jdk1.7.0_72'  (設定環境變量)

3.3

[Install]

Alias:别名

Also(可選):當目前這個 unit 本身被

enable 時,Also 後面接的 unit 也請 enable 的意思!也就是具有相依性的服務可以寫在這裡呢!

WantedBy:何種情況下,服務被啟用。eg:WantedBy=multi-user.target(多使用者環境下啟用)

作者:​​小家電維修​​

轉世燕還故榻,為你銜來二月的花。

繼續閱讀