使用systemd,我想使用以下属性管理队列工作者的多个实例:
我能够实现这些特性,但是与诸如监督d这样的替代方案相比,解决方案的特性更多。是否有一种简单的方法可以单独使用systemd来管理多实例服务?
发布于 2022-09-19 15:38:40
步骤:使用systemd管理多个服务实例
Restart=on-failure )中使用2设置。PartOf、After和WantedBy依赖关系3.使辅助服务依赖于这个主服务。设置: systemd单元文件
创建这两个文件:
/etc/systemd/system/queue_worker@..service:
[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:
[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“启用”这些服务。这将为每个实例创建一个指向服务模板文件的符号链接:
# 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启动每个辅助服务:
# 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成功地触发了三个工作人员服务。然而,工人服务不是主要服务的依赖者,我无法想出一个办法来实现这一点。主营业务也具有特殊的活动状态“活跃(退出)”。
停止和重新启动工人服务也可以通过主要服务直接实现:
# systemctl stop queue_main # terminates all queue worker service instances
# systemctl restart queue_main # restarts all queue worker service instances仅使用systemctl监视多个服务实例
不幸的是,我们的queue_main.service的状态并不是关于单个工人的状态的信息。为了监视工人,我们需要检查他们的个人状况。我们可以通过以下方式获得易于编写脚本的输出:
# 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上进行了测试。
https://stackoverflow.com/questions/73775968
复制相似问题