有两种机制可以启动/停止我的程序“abc”
- /usr/lib/systemd/system/abc.service 内的 systemctl 服务文件
- /etc/abc init script abc script 将调用所有守护进程。但是当我使用 /etc/abc 启动/停止守护进程时,systemctl 状态不准确
为了解决这个问题,我添加了 Type=forking 并添加了 PIDFile 指令。解决了停站的问题。当我使用 abc init 脚本停止守护进程时,systemctl 状态将显示为非活动状态。所以这个问题得到了部分解决。但当我使用 abc init 脚本启动守护进程时,它仍然处于非活动状态。
我该如何解决这个问题?我尝试引入一个 abc.path 文件,该文件检查文件是否存在,然后通知服务。但这没有帮助。
使用系统 219。
答案1
当然可以。
如果它们不是由服务管理子系统启动的,则服务管理子系统不会跟踪它们。事实上,它们不会成为真正的守护进程。
rc
van 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 verb
systemctl verb name
start
stop
在缺乏兼容机制的情况下
并非所有操作系统都具有这种 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 脚本。它是如此简单。使用service
或systemctl
命令与systemd的服务管理进行通信;但不要直接运行来停止、启动、获取服务状态。/etc/init.d/anything
从属一点是你不应该胡思乱想/usr/lib/systemd/system/abc.service
只是为了让范·斯穆伦伯格的rc
剧本能够发挥作用。 Type=forking
是几乎肯定是错的为您服务。 (它与几乎所有实际的服务并不匹配。)如果提出这个方案的人/usr/lib/systemd/system/abc.service
能够摆脱众所周知的被破坏的 PID 文件机制,而这种机制对于真正的服务管理来说是完全不必要的,那么它就可以实现。再把它放回去真是愚蠢至极。
进一步阅读
- 乔纳森·德博因·波拉德 (2015)。Unix 守护进程的就绪协议问题。经常给出的答案。
- 乔纳森·德博因·波拉德 (2015)。“继承与守护进程谬误”。“service”命令不再有问题。吃点东西。 JdeBP 的软件。
- 乔纳森·德博因·波拉德 (2001)。 设计 Unix 守护程序时要避免的错误。常见答案。
- https://unix.stackexchange.com/a/200365/5132
- systemd 如何确定服务已停止?
- service 与 systemctl 脚本——使用哪个