CentOS 7 系列(四)系统服务配置 服务(Service)
System.service:
服務(wù)單元,你可以理解為系統(tǒng)服務(wù)和原來(lái)的init.d下面的服務(wù)一樣,只是比它更加豐富。每一個(gè)服務(wù)都是以.service進(jìn)行標(biāo)識(shí)的,如下圖:
| STATE | 說(shuō)明 |
| disabled | 表示開機(jī)不啟動(dòng) |
| enabled | 表示開機(jī)啟動(dòng) |
| static | 對(duì)應(yīng)Unit文件中沒(méi)有定義[install]區(qū)域,因此無(wú)法設(shè)置為開機(jī)啟動(dòng) |
我們看看一個(gè)服務(wù)包含哪些內(nèi)容:
systemctl?cat?sshd.service通過(guò)這個(gè)圖是不是可以看出一些聯(lián)系呢?和之前說(shuō)的單元概念中包括的[Unit]段和[Install]段,這里還多了一個(gè)[Service]段,這個(gè)段就是用來(lái)定義服務(wù)的。我們先說(shuō)一下常用的配置項(xiàng)有哪些:
| 配置項(xiàng) | 說(shuō)明 |
| Type= | 可以包含的值為simple、forking、oneshot、dbus、notify、idel其中之一。
|
| ReaminAfterExit= | 當(dāng)該服務(wù)的所有進(jìn)程都退出之后,是否依然將此無(wú)視為活動(dòng)的,默認(rèn)為no。 |
| GuessMainPID= | 在沒(méi)有設(shè)置PIDFile=值的時(shí)候,systemd是否要猜測(cè)主進(jìn)程的PID。默認(rèn)是yes。 |
| PIDFile= | 守護(hù)進(jìn)程的PID文件,必須是絕對(duì)路徑,強(qiáng)烈建議在Type=forking的情況下明確設(shè)置此選項(xiàng)。這個(gè)路徑也不是隨便寫的,而是你的進(jìn)程實(shí)際的PID文件路徑。這樣systemd才能正確的讀取該文件,但是它不會(huì)寫入,只是會(huì)在服務(wù)停止后刪除該文件,如果存在的話。 |
| BusName= | 設(shè)置與此服務(wù)通訊所使用的D-Bus名稱,如果Type=dbus,則必須設(shè)置此項(xiàng)。 |
| ExecStart= | 設(shè)置啟動(dòng)服務(wù)是要執(zhí)行的命令(命令+參數(shù))。命令行必須是一個(gè)絕對(duì)路徑表示可執(zhí)行文件的位置,后面可以跟多個(gè)該命令支持的參數(shù)。如果在命令前面加上下面的標(biāo)志,將會(huì)有不同含義:
如果設(shè)置多個(gè)ExecStart=那么將依次運(yùn)行,如果某個(gè)沒(méi)有“-”前綴的命令執(zhí)行失敗,那么后續(xù)的ExecStart=將不會(huì)執(zhí)行,同時(shí)該單元變?yōu)槭?#xff08;failed)狀態(tài)。 如果沒(méi)有設(shè)置Type=forking時(shí),這里的命令所啟動(dòng)的進(jìn)程,將被視為該服務(wù)的主守護(hù)進(jìn)程。 |
ExecStartPre= ExecStartPost= | 在執(zhí)行ExecStart之前或之后運(yùn)行的命令。規(guī)則與ExecStart=相同。 對(duì)于ExecStartPost= 命令僅在服務(wù)已經(jīng)啟動(dòng)成功之后才會(huì)運(yùn)行,判斷的標(biāo)準(zhǔn)基于 Type= 選項(xiàng)。 具體說(shuō)來(lái),對(duì)于 Type=simple 或 Type=idle 就是主進(jìn)程已經(jīng)成功啟動(dòng); 對(duì)于 Type=oneshot 來(lái)說(shuō)就是主進(jìn)程已經(jīng)成功退出; 對(duì)于 Type=forking 來(lái)說(shuō)就是初始進(jìn)程已經(jīng)成功退出; 對(duì)于 Type=notify 來(lái)說(shuō)就是已經(jīng)發(fā)送了 "READY=1" ; 對(duì)于 Type=dbus 來(lái)說(shuō)就是已經(jīng)取得了 BusName= 中設(shè)置的總線名稱。注意一下2點(diǎn):
|
| ExecReload= | 這是一個(gè)可選的指令, 用于設(shè)置當(dāng)該服務(wù)被要求重新載入配置時(shí)所執(zhí)行的命令行。 語(yǔ)法規(guī)則與 ExecStart= 完全相同。 另外,還有一個(gè)特殊的環(huán)境變量 $MAINPID 可用于表示主進(jìn)程的PID, 例如可以這樣使用:/bin/kill -HUP $MAINPID 注意,像上例那樣,通過(guò)向守護(hù)進(jìn)程發(fā)送復(fù)位信號(hào), 強(qiáng)制其重新加載配置文件,并不是一個(gè)好習(xí)慣。 因?yàn)檫@是一個(gè)異步操作, 所以不適用于需要按照特定順序重新加載配置文件的服務(wù)。 我們強(qiáng)烈建議將 ExecReload= 設(shè)為一個(gè) 能夠確保重新加載配置文件的操作同步完成的命令行 |
| ExecStop= | 這是一個(gè)可選的指令, 用于設(shè)置當(dāng)該服務(wù)被要求停止時(shí)所執(zhí)行的命令行。 語(yǔ)法規(guī)則與 ExecStart= 完全相同。 執(zhí)行完此處設(shè)置的命令行之后, 該服務(wù)所有剩余的進(jìn)程將會(huì)根據(jù) KillMode= 的設(shè)置被殺死(參見 systemd.kill(5))。 如果未設(shè)置此選項(xiàng),那么當(dāng)此服務(wù)被停止時(shí), 該服務(wù)的所有進(jìn)程都將會(huì)根據(jù) KillSignal= 的設(shè)置被立即全部殺死。 與 ExecReload= 一樣, 也有一個(gè)特殊的環(huán)境變量 $MAINPID 可用于表示主進(jìn)程的PID 一般來(lái)說(shuō), 僅僅設(shè)置一個(gè)結(jié)束服務(wù)的命令而不等待其完成, 是不夠的。 因?yàn)楫?dāng)此處設(shè)置的命令執(zhí)行完之后, 剩余的進(jìn)程會(huì)被 SIGKILL 信號(hào)立即殺死, 這可能會(huì)導(dǎo)致數(shù)據(jù)丟失。 因此,這里設(shè)置的命令必須是同步操作, 而不能是異步操作。 注意,僅在服務(wù)確實(shí)啟動(dòng)成功的前提下,才會(huì)執(zhí)行 ExecStop= 中設(shè)置的命令。 如果服務(wù)從未啟動(dòng)或啟動(dòng)失敗(例如,任意一個(gè) ExecStart=, ExecStartPre=, ExecStartPost= 中無(wú) "-" 前綴的命令執(zhí)行失敗或超時(shí)), 那么 ExecStop= 將會(huì)被跳過(guò)。 如果想要無(wú)條件的在服務(wù)停止后執(zhí)行特定的動(dòng)作,那么應(yīng)該使用 ExecStopPost= 選項(xiàng)。 應(yīng)該將此選項(xiàng)用于那些必須在服務(wù)干凈的退出之前執(zhí)行的命令。 當(dāng)此選項(xiàng)設(shè)置的命令被執(zhí)行的時(shí)候,應(yīng)該假定服務(wù)正處于完全正常的運(yùn)行狀態(tài),可以正常的與其通信。 如果想要無(wú)條件的在服務(wù)停止后"清理尸體",那么應(yīng)該使用 ExecStopPost= 選項(xiàng)。 KillMode=的值有如下幾種:
默認(rèn)是control-group。 |
| ExecStopPost= | 這是一個(gè)可選的指令, 用于設(shè)置在該服務(wù)停止之后所執(zhí)行的命令行。 語(yǔ)法規(guī)則與 ExecStart= 完全相同。 注意,與 ExecStop= 不同,無(wú)論服務(wù)是否啟動(dòng)成功, 此選項(xiàng)中設(shè)置的命令都會(huì)在服務(wù)停止后被無(wú)條件的執(zhí)行。 應(yīng)該將此選項(xiàng)用于設(shè)置那些無(wú)論服務(wù)是否啟動(dòng)成功都必須在服務(wù)停止后無(wú)條件執(zhí)行的清理操作。 此選項(xiàng)設(shè)置的命令必須能夠正確處理由于服務(wù)啟動(dòng)失敗而造成的各種殘缺不全以及數(shù)據(jù)不一致的場(chǎng)景。 由于此選項(xiàng)設(shè)置的命令在執(zhí)行時(shí),整個(gè)服務(wù)的所有進(jìn)程都已經(jīng)全部結(jié)束,所以無(wú)法與服務(wù)進(jìn)行任何通信。 |
| RestartSec= | 設(shè)置在重啟服務(wù)(Restart=)前暫停多長(zhǎng)時(shí)間。 默認(rèn)值是100毫秒(100ms)。 如果未指定時(shí)間單位,那么將視為以秒為單位。 例如設(shè)為"20"等價(jià)于設(shè)為"20s" |
| TimeoutStartSec= | 設(shè)置該服務(wù)允許的最大啟動(dòng)時(shí)長(zhǎng)。 如果守護(hù)進(jìn)程未能在限定的時(shí)長(zhǎng)內(nèi)發(fā)出"啟動(dòng)完畢"的信號(hào),那么該服務(wù)將被視為啟動(dòng)失敗,并會(huì)被關(guān)閉。 如果未指定時(shí)間單位,那么將視為以秒為單位。 |
| TimeoutStopSec= | 設(shè)置該服務(wù)允許的最大停止時(shí)長(zhǎng)。 如果該服務(wù)未能在限定的時(shí)長(zhǎng)內(nèi)成功停止, 那么將會(huì)被強(qiáng)制使用 SIGTERM 信號(hào)關(guān)閉, 如果依然未能在相同的時(shí)長(zhǎng)內(nèi)成功停止, 那么將會(huì)被強(qiáng)制使用 SIGKILL 信號(hào)關(guān)閉。如果未指定時(shí)間單位,那么將視為以秒為單位。 例如設(shè)為"20"等價(jià)于設(shè)為"20s"。 設(shè)為 "infinity" 則表示永不超時(shí)。 |
| RuntimeMaxSec= | 允許服務(wù)持續(xù)運(yùn)行的最大時(shí)長(zhǎng)。 如果服務(wù)持續(xù)運(yùn)行超過(guò)了此處限制的時(shí)長(zhǎng),那么該服務(wù)將會(huì)被強(qiáng)制終止,同時(shí)將該服務(wù)變?yōu)槭?failed)狀態(tài)。 注意,此選項(xiàng)對(duì) Type=oneshot 類型的服務(wù)無(wú)效,因?yàn)樗鼈儠?huì)在啟動(dòng)完成后立即終止。 默認(rèn)值為 "infinity" (不限時(shí)長(zhǎng))。 |
| WatchdogSec= | 設(shè)置該服務(wù)的看門狗(watchdog)的超時(shí)時(shí)長(zhǎng)。 看門狗將在服務(wù)成功啟動(dòng)之后被啟動(dòng)。 該服務(wù)在運(yùn)行過(guò)程中必須周期性的以 "WATCHDOG=1" ("keep-alive ping")調(diào)用 sd_notify(3) 函數(shù)。 如果在兩次調(diào)用之間的時(shí)間間隔大于這里設(shè)定的值, 那么該服務(wù)將被視為失敗(failed)狀態(tài), 并會(huì)被強(qiáng)制使用 SIGABRT 信號(hào)關(guān)閉。 通過(guò)將 Restart= 設(shè)為 on-failure, on-watchdog, on-abnormal, always 之一, 可以實(shí)現(xiàn)在失敗狀態(tài)下的自動(dòng)重啟該服務(wù)。 這里設(shè)置的值將會(huì)通過(guò) WATCHDOG_USEC= 環(huán)境變量傳遞給守護(hù)進(jìn)程, 這樣就允許那些支持看門狗的服務(wù)自動(dòng)啟用"keep-alive ping"。 如果設(shè)置了此選項(xiàng), 那么必須將 NotifyAccess= 設(shè)為 main(此種情況下的隱含默認(rèn)值) 或 all 。 如果未指定時(shí)間單位,那么將視為以秒為單位。 例如設(shè)為"20"等價(jià)于設(shè)為"20s"。 默認(rèn)值"0"表示禁用看門狗功能。 詳見 sd_watchdog_enabled(3) 與 sd_event_set_watchdog(3) 手冊(cè)。 |
| Restart= | 當(dāng)服務(wù)進(jìn)程正常退出、異常退出、被殺死、超時(shí)的時(shí)候,是否重啟系統(tǒng)該服務(wù)。進(jìn)程通過(guò)正常操作被停止則不會(huì)被執(zhí)行重啟。可選值為:
所謂正常退出是指,退出碼為“0”,或者到IGHUP,?SIGINT,?SIGTERM,?SIGPIPE?信號(hào)之一,并且退出碼符合?SuccessExitStatus=?的設(shè)置。 所謂異常退出時(shí)指,退出碼不為“0”,或者被強(qiáng)殺或者因?yàn)槌瑫r(shí)被殺死。 |
| SuccessExitStatus= | 額外定義附加的進(jìn)程"正常退出"狀態(tài)。 可以設(shè)為一系列以空格分隔的數(shù)字退出碼或者信號(hào)名稱 |
說(shuō)明:如果在ExecStart=中設(shè)置多個(gè)命令,那么每個(gè)命令必須用“\;”隔開,且只有Type=oneshot時(shí)才可用。 | |
另外在[Service]段中還可以使用:
| 配置項(xiàng) | 說(shuō)明 |
| WorkingDirectory= | 設(shè)置進(jìn)程的工作目錄。 既可以設(shè)為特殊值 "~" 表示 User= 用戶的家目錄, 也可以設(shè)為一個(gè)以 RootDirectory= 為基準(zhǔn)的絕對(duì)路徑。 例如當(dāng) RootDirectory=/sysroot 并且 WorkingDirectory=/work/dir 時(shí), 實(shí)際的工作目錄將是 /sysroot/work/dir 。 當(dāng) systemd 作為系統(tǒng)實(shí)例運(yùn)行時(shí),此選項(xiàng)的默認(rèn)值是 / ; 當(dāng) systemd 作為用戶實(shí)例運(yùn)行時(shí),此選項(xiàng)的默認(rèn)值是對(duì)應(yīng)用戶的家目錄。 如果給目錄加上 "-" 前綴, 那么表示即使此目錄不存在,也不算致命錯(cuò)誤。 如果未設(shè)置 RootDirectory= 選項(xiàng), 那么為 WorkingDirectory= 設(shè)置的絕對(duì)路徑 將以主機(jī)(或容器)的根目錄(也就是運(yùn)行 systemd 的系統(tǒng)根目錄)為基準(zhǔn)。 注意,設(shè)置此選項(xiàng)將會(huì)導(dǎo)致自動(dòng)添加額外的依賴關(guān)系(見上文)。 |
| RootDirectory= | 設(shè)置以 chroot(2) 方式執(zhí)行進(jìn)程時(shí)的根目錄。 必須設(shè)為一個(gè)以主機(jī)(或容器)的根目錄(也就是運(yùn)行 systemd 的系統(tǒng)根目錄)為基準(zhǔn)的絕對(duì)路徑。 如果設(shè)置了此選項(xiàng), 必須確保進(jìn)程及其輔助文件在 chroot() 監(jiān)獄中確實(shí)可用。 注意,設(shè)置此選項(xiàng)將會(huì)導(dǎo)致自動(dòng)添加額外的依賴關(guān)系(見上文)。 |
User= Group= | 設(shè)置進(jìn)程在執(zhí)行時(shí)使用的用戶與組。 既可以設(shè)為數(shù)字形式的ID也可以設(shè)為字符串形式的名稱。 如果沒(méi)有明確設(shè)置 Group= 選項(xiàng),則使用 User= 所屬的默認(rèn)組。 此選項(xiàng)不影響帶有 "+" 前綴的命令。 |
| Nice= | 設(shè)置進(jìn)程的默認(rèn)謙讓值。 可以設(shè)為 -20(最高優(yōu)先級(jí)) 到 19(最低優(yōu)先級(jí)) 之間的整數(shù)值。 |
| Environment= | 設(shè)置進(jìn)程的環(huán)境變量, 值是一個(gè)空格分隔的 VAR=VALUE 列表。 可以多次使用此選項(xiàng)以增加新的變量或者修改已有的變量 (同一個(gè)變量以最后一次的設(shè)置為準(zhǔn))。 若設(shè)為空, 則表示清空先前所有已設(shè)置的變量。 注意: (1)不會(huì)在字符串內(nèi)部進(jìn)行變量展開(也就是"$"沒(méi)有特殊含義); (2)如果值中包含空格, 那么必須在字符串兩邊使用雙引號(hào)(")界定 Environment="VAR1=word1 word2"。 |
| EnvironmentFile= | 與 Environment= 類似, 不同之處在于此選項(xiàng)是從文本文件中讀取環(huán)境變量的設(shè)置。 文件中的空行以及以分號(hào)(;)或井號(hào)(#)開頭的行會(huì)被忽略, 其他行的格式必須符合 VAR=VALUE 的shell變量賦值語(yǔ)法。 行尾的反斜杠(\)將被視為續(xù)行符, 這與shell語(yǔ)法類似。 若想在變量值中包含空格, 則必須在值的兩端加上雙引號(hào)(")界定。 文件必須用絕對(duì)路徑表示(可以包含通配符)。 但可在路徑前加上"-"前綴表示忽略不存在的文件。 可以多次使用此選項(xiàng), 以從多個(gè)不同的文件中讀取設(shè)置。 若設(shè)為空, 則表示清空所有先前已經(jīng)從文件中讀取的環(huán)境變量。 這里列出的文件將在進(jìn)程啟動(dòng)前的瞬間被讀取, 因此可以由前一個(gè)單元生成配置文件, 再由后一個(gè)單元去讀取它。 從文件中讀取的環(huán)境變量會(huì)覆蓋 Environment= 中設(shè)置的同名變量。 文件的讀取順序就是它們出現(xiàn)在單元文件中的順序, 并且對(duì)于同一個(gè)變量,以最后讀取的文件中的設(shè)置為準(zhǔn)。 |
我們?cè)倩貋?lái)看之前的sshd的服務(wù)定義:
現(xiàn)在你就知道如何定義一個(gè)服務(wù)了。尤其是編譯安裝軟件的時(shí)候,較新版本的軟件可能提供了.service的文件,如果沒(méi)有你就需要自己寫。
常用命令
#啟動(dòng)一個(gè)服務(wù) systemctl?start?postfix.service #關(guān)閉一個(gè)服務(wù) systemctl?stop?postfix.service #重啟一個(gè)服務(wù) systemctl?restart?postfix.service #顯示一個(gè)服務(wù)的狀態(tài) systemctl?status?postfix.service #在開機(jī)時(shí)啟用一個(gè)服務(wù) systemctl?enable?postfix.service #在開機(jī)時(shí)禁用一個(gè)服務(wù) systemctl?disable?postfix.service #查看服務(wù)是否開機(jī)啟動(dòng) systemctl?is-enabled?postfix.service #查看已啟動(dòng)的服務(wù)列表 systemctl?list-unit-files|grep?enabled #查看啟動(dòng)失敗的服務(wù)列表 systemctl?--failed #重新加載service文件 systemctl?daemon-reload這里我們用一個(gè)memcached來(lái)演示一下,我們編譯安裝好了memcached。如何設(shè)置服務(wù)腳本:
配置文件
轉(zhuǎn)載于:https://blog.51cto.com/littledevil/1912570
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的CentOS 7 系列(四)系统服务配置 服务(Service)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于单车创新的一两点思考
- 下一篇: 《自己动手做交互系统》——导读