網(wǎng)站代理備案信陽網(wǎng)站推廣公司
接前一篇文章:Linux系統(tǒng)服務(wù)之一次性服務(wù)(1)
?本文內(nèi)容參考以下文章:
Systemd OneShot 系統(tǒng)啟動時運行一次特定的命令或腳本,并在執(zhí)行完畢后自動退出-CSDN博客
oneshot一次性服務(wù)_type=oneshot-CSDN博客
systemd.service 中文手冊 [金步國]
Systemd 入門教程:實戰(zhàn)篇 - 阮一峰的網(wǎng)絡(luò)日志
特此致謝!
三、讀懂服務(wù)配置文件
上一回已講過,systemd的Service Unit文件(服務(wù)單位文件)用于配置和管理系統(tǒng)中的服務(wù)。Service Unit文件的擴展名為.service,通常存儲在/etc/systemd/system/目錄下或/usr/lib/systemd/system/目錄下。
下面是Service Unit文件的一些常見組成部分即配置項:
1. [Unit] 部分
此部分定義服務(wù)的基本信息、啟動順序與依賴關(guān)系。包括以下字段:
- Description
描述此服務(wù)的簡短說明、簡單描述。
- Documentation
給出文檔位置。
- After
指定此服務(wù)在哪些其它服務(wù)之后啟動。
- Before
指定此服務(wù)在哪些其它服務(wù)之前啟動。
注:After和Before字段只涉及啟動順序,不涉及依賴關(guān)系。
- Requires、Wants、BindsTo
指定此服務(wù)所依賴的其它服務(wù)。其中:Wants表示當前服務(wù)與其所依賴服務(wù)之間的弱依賴關(guān)系,即如果所依賴服務(wù)啟動失敗或異常退出,并不影響當前服務(wù)繼續(xù)執(zhí)行;Requies表示當前服務(wù)與其所依賴服務(wù)之間的強依賴關(guān)系,即如果所依賴服務(wù)啟動失敗或異常退出,那么當前服務(wù)也必須退出。
注:Requires和Wants字段只涉及依賴關(guān)系,不涉及啟動順序。
2.?[Service] 部分
此部分定義服務(wù)的執(zhí)行參數(shù)和行為,更通俗地說是定義如何啟動當前服務(wù)。分為命令、類型、重啟行為三類。
(1)命令
包括以下字段:
- ExecStart
在啟動該服務(wù)時需要執(zhí)行的命令行(命令+參數(shù))。即指定服務(wù)的啟動命令或可執(zhí)行文件路徑。
- ExecStop
當該服務(wù)被要求停止時所執(zhí)行的命令行。即停止該服務(wù)時執(zhí)行的命令。執(zhí)行完此處設(shè)置的所有命令行之后,該服務(wù)將被視為已經(jīng)停止。此字段是可選的。
- ExecStartPre
在執(zhí)行ExecStart之前執(zhí)行的命令行。即啟動此服務(wù)之前執(zhí)行的命令。
- ExecStartPos
在執(zhí)行ExecStart之后執(zhí)行的命令行。即啟動此服務(wù)之后執(zhí)行的命令。
- ExecStopPost
在該服務(wù)停止之后所執(zhí)行的命令行。無論服務(wù)是否啟動成功, 此選項中設(shè)置的命令都會在服務(wù)停止后被無條件的執(zhí)行。此字段是可選的。
- ExecReload
當該服務(wù)被要求重新載入配置時所執(zhí)行的命令行。即重新加載服務(wù)配置時執(zhí)行的命令。此字段是可選的。
- Environment
設(shè)置環(huán)境變量。
- EnvironmentFile
從指定的文件中加載環(huán)境變量。即指定當前服務(wù)的環(huán)境參數(shù)文件。
(2)類型
Type字段用于定義服務(wù)的類型,其指定了如何啟動和管理服務(wù)的主進程。通過在Service Unit文件中設(shè)置Type選項,可以根據(jù)服務(wù)的特性和需求選擇合適的服務(wù)類型,以確保systemd正確地管理和監(jiān)控服務(wù)的狀態(tài)和行為。Type選項的值可以是以下之一:
- simple(默認值)
如果設(shè)為simple(
當設(shè)置了ExecStart=
、 但是沒有設(shè)置Type=
與BusName=
時,這是默認值), 那么ExecStart=
進程就是該服務(wù)的主進程,并且systemd會認為在創(chuàng)建了該服務(wù)的主服務(wù)進程之后,該服務(wù)就已經(jīng)啟動完成。
如果此進程需要為系統(tǒng)中的其它進程提供服務(wù),那么必須在該服務(wù)啟動之前先建立好通信渠道(例如套接字)。?這樣,在創(chuàng)建主服務(wù)進程之后、執(zhí)行主服務(wù)進程之前,即可啟動后繼單元,從而加快了后繼單元的啟動速度。
simple最常見的服務(wù)類型。當使用simple類型時,systemd假定服務(wù)的主進程會一直運行,直到服務(wù)被顯式停止或發(fā)生錯誤。這是大多數(shù)服務(wù)的默認類型。
- exec
exec
與simple
類似,不同之處在于,只有在該服務(wù)的主服務(wù)進程執(zhí)行完成之后,systemd才會認為該服務(wù)啟動完成。其它后繼單元必須一直阻塞到這個時間點之后才能繼續(xù)啟動。換句話說,simple
表示當fork()
返回時,即算是啟動完成,而exec
則表示僅在fork()
與execve()
函數(shù)都執(zhí)行成功時,才算是啟動完成。這就意味著對于exec
類型的服務(wù)來說,如果不能成功調(diào)用主服務(wù)進程(例如User=
不存在、或者二進制可執(zhí)行文件不存在),那么systemctl start將會執(zhí)行失敗。
- forking
如果設(shè)為forking
,那么表示ExecStart=
進程將會在啟動過程中使用fork()
系統(tǒng)調(diào)用。也就是當所有通信渠道都已建好、啟動亦已成功之后,父進程將會退出,而子進程將作為主服務(wù)進程繼續(xù)運行。 這是傳統(tǒng)UNIX守護進程的經(jīng)典做法。 在這種情況下,systemd 會認為在父進程退出之后,該服務(wù)就已經(jīng)啟動完成。
如果使用了此種類型,那么建議同時設(shè)置PIDFile=
選項,以幫助systemd準確可靠的定位該服務(wù)的主進程。systemd將會在父進程退出之后 立即開始啟動后繼單元。
forking適用于那些在啟動過程中會創(chuàng)建一個子進程的服務(wù)。在這種類型的服務(wù)中,systemd會等待主進程啟動,并通過監(jiān)視子進程的退出來確定服務(wù)的啟動狀態(tài)。通常,服務(wù)的主進程會立即啟動子進程,然后退出,而子進程則負責實際的服務(wù)運行。
- oneshot
oneshot
與simple
類似,不同之處在于,只有在該服務(wù)的主服務(wù)進程退出之后,systemd才會認為該服務(wù)啟動完成,才會開始啟動后繼單元。此種類型的服務(wù)通常需要設(shè)置RemainAfterExit=
選項。 當Type=
與ExecStart=
都沒有設(shè)置時,Type=
oneshot
就是默認值。
oneshot適用于只需執(zhí)行一次操作的服務(wù),例如在系統(tǒng)啟動時運行一個腳本或執(zhí)行一個命令。當服務(wù)的主進程退出后,systemd將認為服務(wù)已經(jīng)完成,并將其標記為已停止。
- dbus
dbus
與simple
類似,不同之處在于,該服務(wù)只有獲得了BusName=
指定的D-Bus名稱之后,systemd才會認為該服務(wù)啟動完成,才會開始啟動后繼單元。設(shè)為此類型相當于隱含的依賴于dbus.socket
單元。當設(shè)置了BusName=
時, 此類型就是默認值。
用于通過DBus系統(tǒng)總線啟動的服務(wù)。這種類型的服務(wù)通常用于與其它進程進行通信或提供DBus接口。
- notify
notify
與exec
類似,不同之處在于,該服務(wù)將會在啟動完成之后通過sd_notify(3)之類的接口發(fā)送一個通知消息。systemd將會在啟動后繼單元之前,首先確保該進程已經(jīng)成功的發(fā)送了這個消息。
如果設(shè)為此類型,那么下文的NotifyAccess=
將只能設(shè)為非none
值;如果未設(shè)置NotifyAccess=
選項、或者已經(jīng)被明確設(shè)為none
,那么將會被自動強制修改為main
。
notify適用于在服務(wù)啟動完成后向systemd發(fā)送通知的服務(wù)。服務(wù)主進程應(yīng)在啟動完成后向systemd發(fā)送一個特定的信號,以通知systemd該服務(wù)已準備好接受請求。
注意:目前Type=
notify
尚不能與PrivateNetwork=
yes
一起使用。
- idle
idle
與simple
類似,不同之處在于,服務(wù)進程將會被延遲到所有活動任務(wù)都完成之后再執(zhí)行。這樣可以避免控制臺上的狀態(tài)信息與shell腳本的輸出混雜在一起。
idle適用于以非常低優(yōu)先級運行的服務(wù)。這種類型的服務(wù)將在所有其它活動任務(wù)完成后才會啟動。