2016-09-27 19 views
0

我嘗試使用systemd啓動多個進程 - 如果終止包括,則重新啓動。唯一的區別是過程的論點。systemd:相同的多個單元

有沒有辦法避免每個進程的單位文件? 我正在爲所有進程尋找一個單元文件。

通常情況下,我會使用一個開始skript,但是 - 正如我所說 - 重新啓動終止時應該也包括在內。而且我沒有看到用純系統和手工製作的skriptlet來做到這一點。

謝謝!

回答

1

也許使用模板單位可以滿足您的需求。從systemd.unit(5)

可選地,單元可以在運行時從模板文件實例化。這允許從單個配置文件創建多個單元。如果systemd查找單元配置文件,它將首先在文件系統中搜索文字單元名稱。如果沒有成功,並且單元名稱包含「@」字符,systemd將查找共享相同名稱但具有實例字符串(即「@」字符和後綴之間的部分)的單元模板。示例:如果請求服務[email protected],並且沒有找到該名稱的文件,systemd將查找getty @ .service,並在找到該實例時實例化該配置文件中的服務。

要從配置文件中引用實例字符串,可以在許多配置選項中使用特殊的「%i」說明符。詳情請參閱下文。

所以,你可以創建一個文件的MyService @。服務,上面寫着類似

[Unit] 
Description=MyService component %i 
PartOf=myservice.target 

[Service] 
Type=simple 
ExecStart=/usr/local/bin/myservice %i 
Restart=on-failure 

和主單元myservice.target在爲MyService @

[Unit] 
Description=Myservice 
[email protected] [email protected] [email protected] 

的PartOf =規範。服務確保當目標停止或重新啓動時,每個組件都是如此。在Requires = myservice.target中,必須啓動每個組件以使myservice成功啓動。我認爲應該是這樣的情況,如果任何單個組件失敗了,那麼沒有失敗的應該終止;即其全部或全部。如果這不是你想要的,你可以使用Want =而不是Requires =。

這有點尷尬,但如果你需要提供多個參數,你可以通過環境變量引入一個間接尋址。對於模板單元,添加Environment=args=%i並用$args替換ExecStart中的%i。我認爲找到替代方案會更好,但是不瞭解更多關於您的使用情況的信息,我不確定該解決方案是什麼。

+0

完美!謝謝! – chris01

+0

請再提一個問題: 如何通過多個參數? 我試過 需要= myservice @「a 1」.service 但不起作用 – chris01

+1

@chris也許是答案的最後加法有幫助嗎? –

相關問題