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

相关内容