首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用systemd管理批处理作业的多个实例?

如何使用systemd管理批处理作业的多个实例?
EN

Stack Overflow用户
提问于 2022-09-19 15:38:40
回答 1查看 129关注 0票数 -1

使用systemd,我想使用以下属性管理队列工作者的多个实例:

  1. 队列工作人员的数量应该是可配置的。
  2. 每个队列工作人员都应该在失败时重新启动。
  3. 运行一个命令来启动/停止/重新启动队列工作器的所有实例
  4. 使用单个命令,监视队列工作器的所有实例是否正在运行。

我能够实现这些特性,但是与诸如监督d这样的替代方案相比,解决方案的特性更多。是否有一种简单的方法可以单独使用systemd来管理多实例服务?

EN

回答 1

Stack Overflow用户

发布于 2022-09-19 15:38:40

步骤:使用systemd管理多个服务实例

  1. 创建一个systemd模板单元,可以通过在该单元的文件名中添加一个"@“来实现,然后手动创建与此模板1不同的单元。
  2. 在“服务配置”( Service,Restart=on-failure )中使用2设置。
  3. 创建一个不执行任何操作的主服务,然后使用PartOfAfterWantedBy依赖关系3.使辅助服务依赖于这个主服务。
  4. 将systemctl命令排队,以查看是否有任何辅助进程处于非活动状态;主进程的状态信息不丰富。

设置: systemd单元文件

创建这两个文件:

/etc/systemd/system/queue_worker@..service:

代码语言:javascript
复制
[Unit]
Description="Queue Worker instance %i"
PartOf=queue_main.service
After=queue_main.service

[Service]
# Pretend that the component is running
ExecStart=/bin/sleep infinity
Restart=on-failure

[Install]
WantedBy=queue_main.service

/etc/systemd/system/queue_main.service:

代码语言:javascript
复制
[Unit]
Description=Queue Main

[Service]
# execute a dummy program, and keep the service active after exit
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

使用systemd模板创建多个服务实例

首先,我们必须决定我们希望拥有的实例的数量,然后通过systemctl“启用”这些服务。这将为每个实例创建一个指向服务模板文件的符号链接:

代码语言:javascript
复制
# systemctl enable queue_worker\@{1..3}.service
Created symlink /etc/systemd/system/queue_main.service.wants/queue_worker@1.service → /etc/systemd/system/queue_worker@.service.
Created symlink /etc/systemd/system/queue_main.service.wants/queue_worker@2.service → /etc/systemd/system/queue_worker@.service.
Created symlink /etc/systemd/system/queue_main.service.wants/queue_worker@3.service → /etc/systemd/system/queue_worker@.service.

使用systemctl启动和停止多个服务实例

由于我们定义队列工作者服务对队列主服务的依赖关系,启动queue_main.service将导致systemd启动每个辅助服务:

代码语言:javascript
复制
# systemctl start queue_main.service # launches all three worker instances successfully.
# systemctl status queue_main.service
● queue_main.service - Queue Main
     Loaded: loaded (/etc/systemd/system/queue_main.service; enabled; vendor preset: enabled)
     Active: active (exited) since Mon 2022-09-19 15:11:46 UTC; 2min 55s ago
    Process: 404801 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 404801 (code=exited, status=0/SUCCESS)

Sep 19 15:11:46 dev systemd[1]: Starting Queue Main...
Sep 19 15:11:46 dev systemd[1]: Finished Queue Main.

# systemctl status
[...]
├─system-queue_worker.slice
│ ├─queue_worker@1.service
│ │ └─398812 /bin/sleep infinity
│ ├─queue_worker@3.service
│ │ └─398817 /bin/sleep infinity
│ └─queue_worker@2.service
│   └─398815 /bin/sleep infinity

正如我们所看到的,启动的queue_main.service成功地触发了三个工作人员服务。然而,工人服务不是主要服务的依赖者,我无法想出一个办法来实现这一点。主营业务也具有特殊的活动状态“活跃(退出)”。

停止和重新启动工人服务也可以通过主要服务直接实现:

代码语言:javascript
复制
# systemctl stop queue_main # terminates all queue worker service instances
# systemctl restart queue_main # restarts all queue worker service instances

仅使用systemctl监视多个服务实例

不幸的是,我们的queue_main.service的状态并不是关于单个工人的状态的信息。为了监视工人,我们需要检查他们的个人状况。我们可以通过以下方式获得易于编写脚本的输出:

代码语言:javascript
复制
# kill -HUP 404818 # manually kill one worker to make the output more interesting

# systemctl list-units "queue_worker@*.service" --all --no-legend # show the status of all instances
queue_worker@1.service loaded active   running "Queue Worker instance 1"
queue_worker@2.service loaded inactive dead    "Queue Worker instance 2"
queue_worker@3.service loaded active   running "Queue Worker instance 3"

# systemctl list-units "queue_worker@*.service" --all --state=inactive --no-legend # show only inactive services
queue_worker@2.service loaded inactive dead "Queue Worker instance 2"

该解决方案在Ubuntu 20.04系统d 245上进行了测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73775968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档