当然可以。

当然可以。

有两种机制可以启动/停止我的程序“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 文件,该文件检查文件是否存在,然后通知服务。但这没有帮助。

使用系统 219。

答案1

当然可以。

如果它们不是由服务管理子系统启动的,则服务管理子系统不会跟踪它们。事实上,它们不会成为真正的守护进程。

rcvan Smoorenburg兼容性机制的背景

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

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

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

rc这是vanilla 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 服务的一部分,它会转换并切换到该服务,而不运行脚本的其余部分。 (它传递了一些动词,但您正在谈论和,它们的处理方式如下所述。)/etc/init.d/name verbsystemctl verb namestartstop

在缺乏兼容机制的情况下

并非所有操作系统都具有这种 van Smoorenburgrc兼容性机制,可以将直接调用转换为 systemd 的工作方式。某些操作系统(例如由“/etc/init.d/name verb为什么 `init 0` 会导致 Arch 安装时出现“多余参数”?“,例如)不提供 van Smoorenburgrc兼容性根本不,不提供像 Debian/Ubuntu 那样的钩子,甚至彻底禁用 vanilla systemd 附带的兼容性机制。

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

这样的脚本才不是在服务管理下启动一个服务。它会做诸如双分叉之类的事情,徒劳且在大多数情况下徒劳地尝试在实际服务守护进程运行的同一环境中运行。(许多所谓的“守护进程”东西不起作用,也没有起作用自 20 世纪 80 年代以来;这就是 90 年代初发明适当的守护进程管理系统的原因。)但就服务管理而言,它只是交互式登录会话中的超级用户分叉内容。

事实上,systemd 会考虑这种直接调用的 van Smoorenburgrc脚本以及它们派生到后台的所有徒劳的“守护进程”程序,作为用户交互的一部分运行会话范围在用户的内部,而不是作为在用户会话结束时运行的服务系统切片

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

正确的做法

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

从属一点是你不应该胡思乱想/usr/lib/systemd/system/abc.service只是为了让范·斯穆伦伯格的rc剧本能够发挥作用。 Type=forking几乎肯定是错的为您服务。 (它与几乎所有实际的服务并不匹配。)如果提出这个方案的人/usr/lib/systemd/system/abc.service能够摆脱众所周知的被破坏的 PID 文件机制,而这种机制对于真正的服务管理来说是完全不必要的,那么它就可以实现。再把它放回去真是愚蠢至极。

进一步阅读

相关内容