在我的组织中,我们有许多队列消耗工作进程。我们目前正在使用 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