SystemD 產生 N 個進程嗎?

SystemD 產生 N 個進程嗎?

在我的組織中,我們有許多隊列消耗工作進程。我們目前正在使用 SupervisorD 來管理它們,但如果可能的話,希望使用 SystemD 來獲得其中的某些優勢。我在編寫自訂單元方面相當有經驗,但我並沒有立即在 SystemD 領域中找到類似的東西。

在裡面SupervisorD 文檔一個名為「detailed」的參數numprocs允許使用者設定他們想要與該服務一起啟動的進程數。如果我想要啟動 30 個進程,只需一行更改。

SystemD 單元中是否有一個設定允許我指定我想要啟動多少個進程?

答案1

穆尼爾提到的正是你如何做到這一點。基本上,您創建一個service文件,然後啟動它 30 次。這可能看起來有點笨拙,但它有優點,例如可以在其中一個行為不當時將其關閉,而不必關閉所有它們。您也可以採取一些措施來簡化管理。

首先是單位文件。建立一個文件,例如.重要的是符號。/etc/systemd/system/[email protected]@

其內容可能如下所示:

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=multi-user.target

然後從,開始。 啟動的流程將如下所示:systemctl start [email protected]systemctl start [email protected]

root     17222  19   0  0.0  0.0 Ss         00:05 /bin/sleep 600 1
root     17233  19   0  0.0  0.0 Ss         00:02 /bin/sleep 600 2

請注意,當您啟動它時%I, 已被替換為您在之後放置的任何內容@

你可以用一點 shell-fu 來開始所有 30 個:

systemctl start test@{1..30}.service

您也可以像任何普通服務一樣在啟動時啟用它們:。systemctl enable [email protected]

 

現在,我所說的可以使管理變得更容易的事情的意思是:也許您不想使用它test@{1..30}.service來管理所有這些。它有點笨拙。您可以改為為您的服務建立一個新目標。

創建/etc/systemd/system/test.target

[Install]
WantedBy=multi-user.target

然後調整,使其看起來像:/etc/systemd/system/[email protected]

[Unit]
StopWhenUnneeded=true

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=test.target

重新載入 systemd systemctl daemon-reload(僅當您正在修改單元檔案並且沒有跳過它的早期版本時才需要)。現在啟用您想要透過執行以下操作來管理的所有服務systemctl enable test@{1..30}.service
(如果您之前啟用了該服務WantedBy=multi-user.target,請先停用它以清除依賴性)

現在您可以執行systemctl start test.targetsystemctl stop test.target,它將啟動/停止所有 30 個進程。
同樣,您可以像任何其他單元檔案一樣在啟動時啟用:systemctl enable test.target.

答案2

這是我使用在 virtualenv 中運行的 python 腳本的範例:

/etc/systemd/system/[email protected]

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

禁用:sudo systemctl disable my-worker\@{1..30}.service

啟用N個worker:sudo systemctl enable my-worker\@{1..2}.service

重新加載:sudo systemctl daemon-reload

開始:sudo systemctl start [email protected]

檢查狀態:sudo systemctl status my-worker@1

相關內容