在我的组织中,我们有许多消耗队列的工作进程。我们目前正在使用SupervisorD来管理它们,但希望在可能的情况下使用SystemD以获得某些优势。我在编写自定义单位方面相当有经验,但是我没有立即在SystemD中找到类似的东西。
在SupervisorD文档numprocs
中,详细说明了一个名为的参数,该参数允许您设置要使用该服务启动的进程数。如果我要启动30个流程,那是单行更改。
SystemD单元中是否有设置可以让我指定要启动多少个这些进程?
在我的组织中,我们有许多消耗队列的工作进程。我们目前正在使用SupervisorD来管理它们,但希望在可能的情况下使用SystemD以获得某些优势。我在编写自定义单位方面相当有经验,但是我没有立即在SystemD中找到类似的东西。
在SupervisorD文档numprocs
中,详细说明了一个名为的参数,该参数允许您设置要使用该服务启动的进程数。如果我要启动30个流程,那是单行更改。
SystemD单元中是否有设置可以让我指定要启动多少个这些进程?
Answers:
Munir提到的正是您如何做到的。基本上,您创建一个service
文件,并启动30次。现在,这似乎有些不适应,但是它具有一些优点,例如,如果操作不当,可以将其中一个关闭,而不必关闭所有它们。您还可以做一些事情来简化管理。
首先,单位文件。创建一个文件,例如/etc/systemd/system/test@.service
。重要的是@
符号。
它的内容可能看起来像:
[Service]
ExecStart=/bin/sleep 600 %I
[Install]
WantedBy=multi-user.target
然后启动它systemctl start test@1.service
,systemctl 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.target
和systemctl stop test.target
,它将启动/停止所有30个过程。
同样,您可以像其他任何单位文件一样在启动时启用:systemctl enable test.target
。
Restart=on-failure
。阅读systemd.service
手册页以获取更多信息。
这是我的示例,该示例使用在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