在linux下建立自定義服務

2021-07-27 02:56:28 字數 2895 閱讀 9808

歷史版本中的linux對服務的操作是通過service來完成的。若建立使用者自定義的服務,

則需要較為複雜的操作。目前linux新的發行版已經內建了systemctl來操作服務。

新的自定義服務指令碼以service為字尾,這些service檔案存放於/lib/systemd/system中。

我們只需要編寫符合標準規範的service指令碼檔案,放在這個資料夾下面即可。這個標準的服務檔案

格式如下:

這個指令碼分為3個部分:[unit] [service] [install]。

unit表明該服務的描述,型別描述。我們稱之為乙個單元。比較典型的情況是單元a要求在單元b啟動之後

在啟動。這種設定是通過unit下面的requires、after、before、wants來調整的。比如上述

場景的編寫可以這樣(在a中編寫):

requires=b

after=b

這段設定表明了a的啟動依賴於b,同時有要求在b啟動之後啟動自己。設定十分簡介。需要注意的是,

依賴關係通常用在服務(service)而不是目標(target)上。

service是指令碼的關鍵部分,這一部分用於設定一些關鍵引數:

service的啟動方式,在service段中,啟動方式使用type指定。具體可以參考man systemd.service

值得注意的是,在指令碼中關於服務啟動、重啟、關閉的指令需要使用絕對路徑,否則會出現無法識別的情況。

當完成乙個服務指令碼後,我們就可以使用systemctl start|stop|restart ***.service等指令了。

若要開機啟動這個服務:

若要關閉開機啟動:

當我們需要檢視服務資訊的使用可以使用如下指令:

在service片段中有幾個概念很重要,這直接影響到實踐中建立自定義服務的最終結果。以下內容根據linux系統

man systemd.service使用者手冊說明經過翻譯和整理而得。

首先是type配置,在service片段中有type的配置,這個配置給當前的服務單元用於設定程序的啟動型別。

type有如下幾種可選項:

******,這是預設的type,當type和busname配置都沒有設定,指定了execstart設定後,******就是

預設的type設定。******使用execstart建立的程序作為服務的主程序。在此設定下systemd會立即啟動服務,如果該服務要

啟動其他服務(******不會forking),它們的通訊渠道應當在守護程序啟動之前被安裝好(e.g. sockets,通過sockets啟用)。

forking,如果使用了這個type,則execstart的指令碼啟動後會呼叫fork()函式建立乙個程序作為其啟動的一部分。

當一切初始化完畢後,父程序會退出。子程序會繼續作為主程序執行。這是傳統unix主程序的行為。如果這個設定被指定,

建議同時設定pidfile選項來指定pid檔案的路徑,以便systemd能夠識別主程序。

oneshot,onesh的行為十分類似******,但是,在systemd啟動之前,程序就會退出。這是一次性的行為。

可能還需要設定remainafterexit=yes,以便systemd認為j程序退出後仍然處於啟用狀態。

dbus,這個設定也和******很相似,該配置期待或設定乙個name值,通過設定busname=設定name即可。

notify,同樣地,與******相似的配置。顧名思義,該設定會在守護程序啟動的時候傳送推送訊息(通過sd_notify(3))給systemd。

預設值為no,這個設定採用booleean值,可以是0、no、off、1、yes、on等值。

它表明服務是否應當被視為啟用的,即便當它所有的程序都退出了。簡言之,這個設定用於告訴systemd服務是否

應當是被視為啟用狀態,而不管程序是否退出。當為true時,即便服務退出,systemd依然將這個服務視為啟用狀態,

反之則服務停止。

採用boolean值指定systemd在無法確切的查明服務的時候是否需要猜測服務的main pid。

除非type=forking被採用並且pidfile沒有被設定,否則這個選項會被忽略。因為當設定為type的其他

選項,或者顯示的指定了pid檔案後,systemd總是能夠知道main pid。

採用乙個絕對路徑的檔名指定守護程序的pid檔案。當type=forking被設定的時候,建議採取這個設定。

當服務啟動後,systemd會讀取守護程序的主程序id。systemd不會對該檔案寫入資料。

使用乙個d-bus的匯流排名稱,作為該服務的可訪問名稱。當type=dbus的時候,該設定被強制使用。

如果該選項被指定,乙個自定義的kdbus終結點將會被建立,並且會被指定為預設的dbus節點安裝到服務上。

這樣的自定義終結點自身持有乙個策略規則集合。這些規則將會在匯流排範圍內被強制指定。該選項只有在kdbus被啟用時有效。

當服務啟動的時候(systemctl start youservice.service),會執行這個選項的值,

這個值一般是「execstart=指令 引數」的形式。當type=oneshot的時候,只有乙個指令可以並且必須給出。

原因是oneshot只會被執行一次。

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

服務重啟時執行。

服務停止時執行。

服務停止後執行。

未完待續...

Linux 自定義服務命令

這個寫部署禪道的時候包含了這個內容,但是今天弄的時候突然忘記了,所以還是重新寫下。有的同學可能會不知道一些系統自帶的目錄是什麼意思,所以我這裡就拆分下,不直接建立 cd lib systemd systemvi chandao.service unit description chandao aft...

在C 中建立自定義控制項

在c 中建立自定義控制項 建立自定義的控制項有下面幾種方法 1 建立繼承自usercontrol的控制項。對於這樣的控制項,它其實是乙個控制項的容器,你可以像設計一般的窗體一樣設計它,因此,標準的控制項都是可用的。當然了,如果願意,你也可以隨意地在paint事件的處理函式中修改它的外觀。這類自定義控...

建立自定義控制項

在前一篇文章中 中,我將乙個公共視窗控制項進行了之類劃分,目的是為了修飾其行為或者說是擴充套件其功能。有時候,你只能將公共視窗控制項擴充套件到這樣的底部。我遇到的乙個例子是乙個比較普遍的話題即需要乙個格網控制項並且編輯tabular資料。我對clistctrl進行了之類劃分,並擴充套件使其能夠進行子...