如何管理需要多个进程的系统服务?

Jes*_*sse 5 linux crash process systemd

我有一个需要运行多个进程的网站(python、node 等)。我目前创建了一个 systemd 服务,因此我可以轻松启动和停止这些进程。我创建了一个启动脚本,它启动我需要的所有进程作为后台进程(附加&到命令的末尾)。

这使我无法在崩溃时使用 systemd 的自动重启功能,因为所有进程都在单个脚本下启动。

我能想到的一个潜在解决方案是为每个进程创建一个服务,然后通过创建一个主服务将Requires它们链接在一起。我不喜欢这个,因为这意味着我需要为我想要运行的这个网站的每个环境创建 4-5 个服务。

有没有一种方法可以轻松定义启动多个进程并分别监视每个进程的服务?

use*_*686 4

创建多个模板服务,命名如下@

  • website@.service
  • pythonthingy@.service
  • nodethingy@.service

使用模板,您可以为每个网站启动一个命名实例:

systemctl start pythonthingy@clientone.service nodethingy@clientone.service
systemctl start pythonthingy@clienttwo.service nodethingy@clienttwo.service
Run Code Online (Sandbox Code Playgroud)

在此类模板单元中,您可以用来%i引用实例名称(本示例中为“clientone”)。因此“主要”单元(服务或目标)可以具有:

[Unit]
Requires=pythonthingy@%i.service
...
[Service]
Environment="DOCROOT=/var/www/%i"
Run Code Online (Sandbox Code Playgroud)

如果每个站点需要多个参数,您可以从文件加载它们:

[Service]
EnvironmentFile=/etc/someconfigdir/%i.conf
Run Code Online (Sandbox Code Playgroud)

如果某些网站与其他网站相比需要非标准单位设置,请使用直接插件:

  • pythonthingy@.service– 通用模板
  • pythonthingy@clientone.service.d/overrides.conf– 仅适用于客户端 1 的额外参数

模板、插入项和扩展(如 %i)在systemd.unit(5)中进行了解释。