SystemD是否生成N个进程?


13

在我的组织中,我们有许多消耗队列的工作进程。我们目前正在使用SupervisorD来管理它们,但希望在可能的情况下使用SystemD以获得某些优势。我在编写自定义单位方面相当有经验,但是我没有立即在SystemD中找到类似的东西。

SupervisorD文档numprocs中,详细说明了一个名为的参数,该参数允许您设置要使用该服务启动的进程数。如果我要启动30个流程,那是单行更改。

SystemD单元中是否有设置可以让我指定要启动多少个这些进程?


1
您是否要创建同一单元的多个实例?如果是这样,您可能希望查看0pointer.de/blog/projects/instances.html
Munir

Answers:


31

Munir提到的正是您如何做到的。基本上,您创建一个service文件,并启动30次。现在,这似乎有些不适应,但是它具有一些优点,例如,如果操作不当,可以将其中一个关闭,而不必关闭所有它们。您还可以做一些事情来简化管理。

首先,单位文件。创建一个文件,例如/etc/systemd/system/test@.service。重要的是@符号。

它的内容可能看起来像:

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

[Install]
WantedBy=multi-user.target

然后启动它systemctl start test@1.servicesystemctl start test@2.service
启动的过程将如下所示:

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 test@1.service

 

现在,我所说的事情意味着可以简化管理:也许您不想使用test@{1..30}.service全部管理。这有点笨拙。您可以改为为服务创建一个新目标。

创建/etc/systemd/system/test.target方式:

[Install]
WantedBy=multi-user.target

然后调整/etc/systemd/system/test@.service,使其看起来像:

[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


感谢您提供详细的答案,我已经搜索了几天。
阿诺莱姆'17

1
您知道这是否会重启失败的进程吗?
bastian

@bastian:可以使用Restart=on-failure。阅读systemd.service手册页以获取更多信息。
siride

1

这是我的示例,该示例使用在virtualenv中运行的python脚本:

/etc/systemd/system/my-worker@.service

[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 enable my-worker\@{1..30}.service

启用N个工人: sudo systemctl enable my-worker\@{1..2}.service

重新加载: sudo systemctl daemon-reload

开始: sudo systemctl start my-worker@2.service

检查状态: sudo systemctl status my-worker@1

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.