1. 程式人生 > >在linux下創建自定義service服務

在linux下創建自定義service服務

常用 絕對路徑 忽略 創建 div 就會 服務腳本 消息 重要

三個部分

這個腳本分為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的配置,這個配置給當前的服務單元用於設置進程的啟動類型。

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只會被執行一次。

  • ExecStartPreExecStartPost

顧名思義,這兩個設置的意義在於ExecStart被執行之前和之後被執行。

  • ExecReload

服務重啟時執行。

  • ExecStop

服務停止時執行。

  • ExecStopPost

服務停止後執行。



作者:萬歲爺
鏈接:https://www.jianshu.com/p/92208194d700
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。

在linux下創建自定義service服務