在我的組織中,我們有許多隊列消耗工作進程。我們目前正在使用 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.target
和systemctl 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