在linux下創建自定義service服務
三個部分
這個腳本分為3個部分:[Unit] [Service] [Install]。
Unit
Unit表明該服務的描述,類型描述。我們稱之為一個單元。比較典型的情況是單元A要求在單元B啟動之後再啟動。這種設置是通過Unit下面的Requires、After、Before、Wants
來調整的。比如上述場景的編寫可以這樣(在A中編寫):
Requires=B
After=B
這段設置表明了A的啟動依賴於B,同時有要求在B啟動之後啟動自己。設置十分簡介。需要註意的是,依賴關系通常用在服務(Service)而不是目標(Target)上。
Service
Service是腳本的關鍵部分,這一部分用於設置一些關鍵參數:
Type=forking
: 後臺運行模式PIDFile=/xxx/xxx.xxx
: 存放PID文件的位置ExecStart=/bin/echo xxx
: 這是服務運行的具體執行命令ExecReload=/bin/echo xxx
: 這是服務重啟的執行命令EexcStop=/bin/echo xxx
: 這是服務停止的執行命令
Service的啟動方式,在Service段中,啟動方式使用Type指定。具體可以參考man systemd.service
。
值得註意的是,在腳本中關於服務啟動、重啟、關閉的指令需要使用絕對路徑,否則會出現無法識別的情況。
當完成一個服務腳本後,我們就可以使用systemctl start|stop|restart xxx.service等指令了。若要開機啟動這個服務我們使用如下的指令:
systemctl enable xxx.service
若要關閉開機啟動:
systemctl disable xxx.service
當我們需要查看服務信息的使用可以使用如下指令:
systemctl list-units --type=service
: 列出正在運行的服務
在service片段中有幾個概念很重要,這直接影響到實踐中創建自定義服務的最終結果。以下內容根據linux系統
中man systemd.service
用戶手冊說明經過翻譯和整理而得。
service配置之Type
首先是Type配置,在service片段中有Type的配置,這個配置給當前的服務單元用於設置進程的啟動類型。
simple
forking
oneshot
dbus
notify
idel
simple,這是默認的Type,當Type和BusName配置都沒有設置,指定了ExecStart設置後,simple就是默認的Type設置。simple使用ExecStart創建的進程作為服務的主進程。在此設置下systemd會立即啟動服務,如果該服務要啟動其他服務(simple不會forking),它們的通訊渠道應當在守護進程啟動之前被安裝好(e.g. sockets,通過sockets激活)。
forking,如果使用了這個Type,則ExecStart的腳本啟動後會調用fork()函數創建一個進程作為其啟動的一部分。當一切初始化完畢後,父進程會退出。子進程會繼續作為主進程執行。這是傳統UNIX主進程的行為。如果這個設置被指定,建議同時設置PIDFile選項來指定pid文件的路徑,以便systemd能夠識別主進程。
oneshot,onesh的行為十分類似simple,但是,在systemd啟動之前,進程就會退出。這是一次性的行為。可能還需要設置RemainAfterExit=yes,以便systemd認為j進程退出後仍然處於激活狀態。
dbus,這個設置也和simple很相似,該配置期待或設置一個name值,通過設置BusName=設置name即可。
notify,同樣地,與simple相似的配置。顧名思義,該設置會在守護進程啟動的時候發送推送消息(通過sd_notify(3))給systemd。
Service其他配置節點
RemainAfterExit
:默認值no
默認值為no,這個設置采用booleean值,可以是0、no、off、1、yes、on等值。它表明服務是否應當被視為激活的,即便當它所有的進程都退出了。簡言之,這個設置用於告訴systemd服務是否應當是被視為激活狀態,而不管進程是否退出。當為true時,即便服務退出,systemd依然將這個服務視為激活狀態,反之則服務停止。
GuessMainPID
采用boolean值指定systemd在無法確切的查明服務的時候是否需要猜測服務的main pid。除非Type=forking
被采用並且PIDFile沒有被設置,否則這個選項會被忽略。因為當設置為Type的其他選項,或者顯示的指定了PID文件後,systemd總是能夠知道main pid。
PIDFile
采用一個絕對路徑的文件名指定守護進程的PID文件。當Type=forking被設置的時候,建議采取這個設置。當服務啟動後,systemd會讀取守護進程的主進程id。systemd不會對該文件寫入數據。
BusName
使用一個D-Bus的總線名稱,作為該服務的可訪問名稱。當Type=dbus
的時候,該設置被強制使用。
BusPolicy
如果該選項被指定,一個自定義的kdbus終結點將會被創建,並且會被指定為默認的dbus節點安裝到服務上。這樣的自定義終結點自身持有一個策略規則集合。這些規則將會在總線範圍內被強制指定。該選項只有在kdbus被激活時有效。
ExecStart
當服務啟動的時候(systemctl start youservice.service
),會執行這個選項的值,這個值一般是“ExecStart=指令 參數”
的形式。當Type=oneshot
的時候,只有一個指令可以並且必須給出。原因是oneshot只會被執行一次。
ExecStartPre
、ExecStartPost
顧名思義,這兩個設置的意義在於ExecStart
被執行之前和之後被執行。
ExecReload
服務重啟時執行。
ExecStop
服務停止時執行。
ExecStopPost
服務停止後執行。
作者:萬歲爺
鏈接:https://www.jianshu.com/p/92208194d700
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。
在linux下創建自定義service服務