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(多使用者環境下啟用)
作者:小家電維修
轉世燕還故榻,為你銜來二月的花。