如果守护进程是通过 systemctl 以外的机制启动的,则 systemctl 无法准确报告守护进程的状态

nit*_*inj 2 linux centos systemd

有两种机制可以启动/停止我的程序“abc”

  1. /usr/lib/systemd/system/abc.service 中的 systemctl 服务文件
  2. /etc/abc init script abc script 将调用所有守护进程。但是当我使用 /etc/abc 启动/停止守护进程时 systemctl 状态不准确

为了解决这个问题,我添加了 Type=forking 并添加了 PIDFile 指令。它解决了停止的问题。当我使用 abc init 脚本停止守护进程时,systemctl 状态将显示为非活动状态。所以问题得到了部分解决。但是当我使用 abc init 脚本启动守护进程时它仍然处于非活动状态。

我该如何解决这个问题?我试图引入一个 abc.path 文件,它检查文件是否存在,然后通知服务。但它没有帮助。

使用 systemd 219。

Jde*_*eBP 6

当然可以。

如果它们不是由服务管理子系统启动的,它们将不会被服务管理子系统跟踪。他们不会是真正的守护神。

van Smoorenburgrc兼容性机制的背景

进一步阅读: https : //unix.stackexchange.com/a/233581/5132

rcsystemd 提供的 van Smoorenburg兼容机制是一个generator。它确保生成的 abc.service服务/etc/init.d/abc start在服务启动和/etc/init.d/abc stop服务停止时运行。

请注意,此时, 的存在/usr/lib/systemd/system/abc.service完全阻止了abc.servicesystemd 的生成器的生成。

这是rcvanilla systemd中 van Smoorenburg兼容性的全部范围。超级用户能够以各种方式直接调用 /etc/init.d/abc并将其连接到 systemd 的能力是由操作系统的个人开发人员作为对 vanilla systemd 的增强而提供的。

例如,Debian 和 Ubuntu 人员他们自己的 /lib/lsb/init-functions.d/子系统中提供了一个钩子,作用如下:

  • 如果钩子检测到init.d脚本作为生成的 systemd 服务的 ExecStart/ExecStop 被调用,它不会做任何特别的事情,只是按原样运行脚本的其余部分。
  • 如果钩子检测到init.d脚本被直接调用,而不是作为生成的 systemd 服务的一部分,它会转换成并切换到那个,而不是运行脚本的其余部分。(它通过的一些动词,但你说的是and ,它们是按照这里解释的方式处理的。)/etc/init.d/name verbsystemctl verb namestartstop

在没有兼容机制的情况下

并非所有操作系统都有这样的 van Smoorenburgrc兼容机制,可以将 的直接调用转化为 systemd 的做事方式。一些操作系统(如在“被人一跑,为什么`0`导致初始化‘多余参数’上拱安装? ”,例如)没有提供面包车Smoorenburg兼容性可言,没有提供像Debian的/钩Ubuntu 甚至完全禁用了 vanilla systemd 附带的兼容性机制。/etc/init.d/name verbrc

在这样的操作系统上,rc直接运行 van Smoorenburg脚本只是按原样运行该脚本。

这样的脚本不会在服务管理下启动服务。它会执行诸如双分叉之类的事情,但在大多数情况下,尝试在实际服务守护程序运行的相同环境中运行是徒劳的,并且毫无结果。自 1980 年代以来;这就是最初在 1990 年代初期发明了适当的守护进程管理系统的原因。)但就服务管理而言,它只是交互式登录会话中的超级用户分叉的东西。

事实上,systemd 会考虑这些直接调用的 van Smoorenburgrc脚本和所有它们分叉到后台的徒劳的“dæmonized”程序,作为用户切片内用户交互式会话范围的一部分运行,而不是作为用户运行的服务系统切片中的会话。

更糟糕的是,它最终使用了 van Smoorenburgrc系统的高度有缺陷的机制,例如杀死在服务停止时与服务名称匹配的任何地方运行的所有进程,而不仅仅是服务管理器启动和跟踪的特定服务进程。这就是为什么在出现工作适合你。该脚本正在杀死与名称匹配的所有进程,该名称恰好还包括在服务管理器下运行的进程。但是,这种不分青红皂白地杀死一切是一个错误,而不是一个功能。这只是适当功能的外观它将/etc/init.d/name stop 咬你一口,因为它在过去的几十年里咬了这么多系统管理员。

正确的做法

如果您缺乏这样的兼容性机制,则不要rc直接调用 van Smoorenburg脚本。它是如此简单。使用serviceorsystemctl命令与 systemd 的服务管理进行通信;但不要直接运行停止、启动和获取服务的状态。/etc/init.d/anything

一个从属的观点是,你应该/usr/lib/systemd/system/abc.service只是为了试图让 van Smoorenburgrc脚本进入某种工作状态而胡思乱想。 Type=forking几乎可以肯定是错误的为您服务。(它与野外几乎所有的实际服务都不匹配。)如果想出的人/usr/lib/systemd/system/abc.service设法摆脱了众所周知的被破坏的 PID 文件机制,这对于真正的服务管理来说是完全不必要的,它再把它放回去是完全愚蠢的。

进一步阅读