runit 不会在 sv stop 或 sv reload 上终止进程

runit 不会在 sv stop 或 sv reload 上终止进程

我正在 AMI Linux 机器上的 jenkins 服务器上运行无头 selenium 进程,全部由 runit 管理。

问题在于发出“sv stop selenium”或“sv reload selenium”不会终止或终止旧实例及其子进程,而只是将它们与 runsv 进程分离,因此它们会在 runit 不知情的情况下继续运行,导致服务重启尝试失败。

我想我的问题与此有点相关: 如何编写 runit 自定义停止脚本

意思是:我应该尝试自定义 d 控制脚本,以便手动清理。

我遵循了这个想法: https://stackoverflow.com/questions/392022/best-way-to-kill-all-child-processes

但是,从 /etc/sv/selenium/supervise/pid 中 cat pid 并将其转发到循环并没有任何区别。

有什么建议吗?

sv运行脚本:

#!/bin/sh

exec 2>&1
exec chpst -u jenkins -U jenkins /usr/bin/xvfb-run \
--server-args="-screen 0 1024x768x32" \
/usr/bin/java -jar /usr/local/bin/selenium-server-standalone-2.42.1.jar \
-ensureCleanSession \
-browserSessionReuse

答案1

如果您在 chpst 命令行中添加 -P,chpst 将为您的服务创建一个新的进程组。然后在您的自定义“d”脚本中,您可以读取 pid 并 kill -TERM -pid 以向整个进程组发送 TERM 信号。

只要没有子进程创建自己的进程组,这应该有效。

但是,单独启动 xvfb 和 java(将它们分成两个 runit 服务)可能会更简洁。

编辑:显然runsv手册页具有误导性;只有在杀死其子进程后runsv才会真正运行该脚本。您应该使用脚本进行清理。感谢@Keith 指出这一点。control/dcontrol/t

相关内容