systemd 服务“激活”到底意味着什么?

systemd 服务“激活”到底意味着什么?

根据文档中的各个条款,“激活”状态是非活动状态和活动状态之间的转换。到目前为止很明显。

但它到底是如何定义的呢?
是什么决定了服务是否不再处于非活动状态而是处于活动状态?
是什么决定了服务是否不再激活而是激活?

我所知道的唯一进入“激活”状态的是脚本ExecStartPre;当它运行时,该服务保持“激活”状态。

是否有其他方法可以使服务保持激活状态?

您能否让该服务启动主服务ExecStart,但仅在可执行文件导致某些特定的“我起来了!”时才考虑该服务处于活动状态?例如事件?

答案1

当它运行时,该服务保持“激活”状态。

这表明您使用了错误的Type=服务文件。有关何时启动什么服务的详细讨论,请参阅man systemd.unit和。systemd.service文本太长,无法合理地复制和粘贴到此处,但根据以下Type=描述man systemd.service

Type=

配置服务通知管理器服务启动已完成的机制。 simple、exec、forking、oneshot、dbus、notify、notify-reload 或idle 之一:

  • 如果设置为(如果指定了simple默认值,但既没有指定,也没有指定),服务管理器将认为该单元在主服务进程被分叉后立即启动(即在配置各种进程属性之后和之前,特别是在之前)新进程已调用来调用实际的服务二进制文件)。通常,这是更好的选择,请参见下文。ExecStart=Type=BusName=fork()execve()Type=exec
  • 类型exec与 simple 类似,但服务管理器会认为该单元在主服务二进制文件执行后立即启动。[...]
  • 如果设置为forking,管理器将认为该单元在管理器分叉的二进制文件退出后立即启动。不鼓励使用这种类型,请使用notify, notify-reload, 或dbus代替 [...]
  • 的行为oneshot类似于simple;但是,服务管理器将在主进程退出后考虑该单元。 […]

[……以及基于总线/通知的方案……]

因此,您的服务从“激活”到“活动”的时间点不同,具体取决于其设置方式。然而,“激活”总是在同一点开始:systemd 开始执行服务文件中指定的任何操作的那一刻。

相关内容