
我注意到一些 systemd 文件和操作文件中有關如何配置一個或多個服務以使用相同計時器的方法存在一些重大變化。
據我所知(儘管我可能是錯的),這將描述什麼通緝者和單元對於單一服務,需要將服務和計時器檔案中的參數設定為(此處不使用實際的程式碼範例 - 為了減少貼文長度),反之,使用單一計時器的多個服務配置:
單一服務的計時器
My.Service1 'WantedBy' Param: N/A (1)
My.Timer 'Unit' Param: My.Service1 (2)
My.Timer 'WantedBy' Param: MultiUser/Basic.Target (3)
(1)服務文件不需要帶有 WantedBy 參數的 [Install] 部分。
(2)在計時器的 [Timer] 部分中,Unit 參數應指向 My.Service1 服務檔案。
(3)計時器檔案有一個 WantedBy 參數,該參數指向將用於啟動它的某些特殊系統目標。
多種服務的計時器
My.Service1 'WantedBy' Param: Timer.Target (1)
My.Service2 'WantedBy' Param: Timer.Target (1)
My.Service3 'WantedBy' Param: Timer.Target (1)
Timer 'Unit' Param: Timer.Target (2)
Timer 'WantedBy' Param: ???
(1)所有服務都需要使用 WantedBy 參數連接到相同的定義目標。
(2)[Timer] Unit 參數也應指向目標。
有關後一種配置的範例,請參見這個操作方法。我將其算作範例 1。
My.Service1 WantedBy: Timer.Target
My.Service2 WantedBy: Timer.Target
My.Service3 WantedBy: Timer.Target
Timer 'Unit' Param: My.Service1 (1)
Timer 'WantedBy' Param: MultiUser/Basic.Target
(1) 這必須是文件中的疏忽,因為如果您讓該單元僅指向多個服務之一,則其他服務將無法使用計時器。這可能是由於其中使用的「參見上文」方法將讀者帶回單一服務配置,而沒有實際提及(重要的是)需要更改的內容。
然後與實施例4它的配置看起來確實可以工作,但它透過直接在服務下建立服務文件來以不同的方式將服務與目標連接起來。/etc/systemd/system/Timer.Target.wants/子目錄並排除服務文件中的任何 WantedBy 參數。因此:
My.Service1 'WantedBy' Param: N/A
My.Service2 'WantedBy' Param: N/A
My.Service3 'WantedBy' Param: N/A
Timer 'Unit' Param: Timer.Target
Timer 'WantedBy' Param: MultiUser/Basic.Target
我見過的範例 1 和範例 4 之間的混合方法是在/etc/systemd/系統/目錄(預設位置)並建立指向這些服務文件的符號鏈接/etc/systemd/system/Timer.Target.wants文件和排除服務文件中包含 WantedBy 參數(功能上與範例 4 相同),而另一種配置使用符號連結方法,但另外在服務文件中包含 WantedBy 參數(這似乎是多餘且不必要的)。
對於範例 4 和混合方法,我的問題是:為什麼要把任何東西放在*.想要如果聲明 WantedBy 參數應該指示 systemd 為您執行此操作(如該參數的解釋所述),則目錄是必需的這一頁)?
在令人困惑的多種方法中,任何人都可以闡明使用相同計時器配置多個服務的最佳方法嗎?
答案1
如果您想使用單一計時器啟動多個服務,請在其間插入目標:
計時器單元,我們稱之為foo.timer
:
[Unit]
Description=My timer that runs saturdays, 9am and triggers foo.target
Wants=foo.target
[Timer]
OnCalendar=Sat 9:00
Unit=foo.target
[Install]
WantedBy=timers.target
目標單位,我們稱之為foo.target
:
[Unit]
Description=My target unit, that groups my two services xxx.service and yyy.service
Wants=xxx.service yyy.service
After=xxx.service yyy.service
[Install]
Also=foo.timer
然後是兩個服務xxx.service
和yyy.service
:
[Unit]
Description=My service XXX
[Service]
ExecStart=/bin/echo I am XXX
[Install]
Also=foo.timer
[Unit]
Description=My service YYY
[Service]
ExecStart=/bin/echo I am YYYY
[Install]
Also=foo.timer
將這四個單元檔案(、、、foo.timer
)複製到.然後透過執行以下命令啟用並啟動計時器:foo.target
xxx.service
yyy.service
/etc/systemd/systemd/
systemctl enable --now foo.timer`
這將掛接foo.timer
到timers.target
,這是通用目標,應該拉入系統上定義的所有各種計時器。
請注意,您也可以執行systemctl enable foo.target
btw 和systemctl enable zzz.service
,因為Also=
這些單元中的行將啟用請求傳播到foo.timer
。
答案2
systemd 計時器總是啟動一個單元。
如果您想按相同的計劃啟動兩個單元,為了清晰起見,我建議建立兩個包含相同計劃的計時器檔案。
否則,您可以建立一個「服務單元」檔案來啟動您想要的兩個服務。
我不認為“WantedBy=”對於計時器單元來說是一個特別有用的概念。