fle*_*ive 2 ubuntu service systemd
使用 systemd,我想管理具有以下属性的队列工作器的多个实例:
我能够实现这些功能,但该解决方案的功能比诸如supervisord之类的替代方案要重。 有没有更简单的方法来单独使用 systemd 来管理多实例服务?
Restart=on-failure服务配置2中的设置。PartOf于该After主服务。WantedBy创建这两个文件:
\n/etc/systemd/system/queue_worker@.service:
\n[Unit]\nDescription="Queue Worker instance %i"\nPartOf=queue_main.service\nAfter=queue_main.service\n\n[Service]\n# Pretend that the component is running\nExecStart=/bin/sleep infinity\nRestart=on-failure\n\n[Install]\nWantedBy=queue_main.service\nRun Code Online (Sandbox Code Playgroud)\n/etc/systemd/system/queue_main.service:
\n[Unit]\nDescription=Queue Main\n\n[Service]\n# execute a dummy program, and keep the service active after exit\nType=oneshot\nExecStart=/bin/true\nRemainAfterExit=yes\n\n[Install]\nWantedBy=multi-user.target\nRun Code Online (Sandbox Code Playgroud)\n首先,我们必须决定想要拥有的实例数量,然后通过 systemctl“启用”这些服务。这将为每个实例创建一个指向服务模板文件的符号链接:
\n# systemctl enable queue_worker\\@{1..3}.service\nCreated symlink /etc/systemd/system/queue_main.service.wants/queue_worker@1.service \xe2\x86\x92 /etc/systemd/system/queue_worker@.service.\nCreated symlink /etc/systemd/system/queue_main.service.wants/queue_worker@2.service \xe2\x86\x92 /etc/systemd/system/queue_worker@.service.\nCreated symlink /etc/systemd/system/queue_main.service.wants/queue_worker@3.service \xe2\x86\x92 /etc/systemd/system/queue_worker@.service.\nRun Code Online (Sandbox Code Playgroud)\n由于我们定义队列工作服务对队列主服务的依赖性的方式,启动queue_main.service将导致systemd启动每个工作服务:
\n# systemctl start queue_main.service # launches all three worker instances successfully.\n# systemctl status queue_main.service\n\xe2\x97\x8f queue_main.service - Queue Main\n Loaded: loaded (/etc/systemd/system/queue_main.service; enabled; vendor preset: enabled)\n Active: active (exited) since Mon 2022-09-19 15:11:46 UTC; 2min 55s ago\n Process: 404801 ExecStart=/bin/true (code=exited, status=0/SUCCESS)\n Main PID: 404801 (code=exited, status=0/SUCCESS)\n\nSep 19 15:11:46 dev systemd[1]: Starting Queue Main...\nSep 19 15:11:46 dev systemd[1]: Finished Queue Main.\n\n# systemctl status\n[...]\n\xe2\x94\x9c\xe2\x94\x80system-queue_worker.slice\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80queue_worker@1.service\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80398812 /bin/sleep infinity\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80queue_worker@3.service\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80398817 /bin/sleep infinity\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80queue_worker@2.service\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80398815 /bin/sleep infinity\nRun Code Online (Sandbox Code Playgroud)\n可以看到,queue_main.service启动成功触发了三个worker服务。但是,工作人员服务并不依赖于主要服务,我无法想出实现此目的的方法。此外,主要服务具有特殊的活动状态“活动(退出)”
停止和重新启动工作服务也可以通过主服务直接实现:
\n# systemctl stop queue_main # terminates all queue worker service instances\n# systemctl restart queue_main # restarts all queue worker service instances\nRun Code Online (Sandbox Code Playgroud)\n不幸的是,我们的现状queue_main.service并不能提供有关个别工人状况的信息。为了监控工人,我们需要检查他们的个人状态。我们可以通过以下方式获得适合脚本编写的输出:
# kill -HUP 404818 # manually kill one worker to make the output more interesting\n\n# systemctl list-units "queue_worker@*.service" --all --no-legend # show the status of all instances\nqueue_worker@1.service loaded active running "Queue Worker instance 1"\nqueue_worker@2.service loaded inactive dead "Queue Worker instance 2"\nqueue_worker@3.service loaded active running "Queue Worker instance 3"\n\n# systemctl list-units "queue_worker@*.service" --all --state=inactive --no-legend # show only inactive services\nqueue_worker@2.service loaded inactive dead "Queue Worker instance 2"\nRun Code Online (Sandbox Code Playgroud)\n该解决方案在 Ubuntu 20.04 和 systemd 245 上进行了测试
\n| 归档时间: |
|
| 查看次数: |
2304 次 |
| 最近记录: |