![systemd 服务“激活”到底意味着什么?](https://linux22.com/image/229493/systemd%20%E6%9C%8D%E5%8A%A1%E2%80%9C%E6%BF%80%E6%B4%BB%E2%80%9D%E5%88%B0%E5%BA%95%E6%84%8F%E5%91%B3%E7%9D%80%E4%BB%80%E4%B9%88%EF%BC%9F.png)
根据文档中的各个条款,“激活”状态是非活动状态和活动状态之间的转换。到目前为止很明显。
但它到底是如何定义的呢?
是什么决定了服务是否不再处于非活动状态而是处于活动状态?
是什么决定了服务是否不再激活而是激活?
我所知道的唯一进入“激活”状态的是脚本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 开始执行服务文件中指定的任何操作的那一刻。