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

And*_*ner 6 daemon service selenium jenkins runit

我正在 AMI Linux 盒子上的 jenkins 服务器上运行无头 selenium 进程,所有进程均由 runit 管理。

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

我认为我的问题与此有关: How to write runit custom stop script

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

我遵循这个想法: /sf/ask/27441571/

然而,从 /etc/sv/selenium/supervise/pid 中获取 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
Run Code Online (Sandbox Code Playgroud)

And*_*orn 5

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

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

然而,单独启动 xvfb 和 java(将它们分成两个 runit 服务)可能会更干净。

编辑:显然runsv手册页具有误导性;只有在脚本已经杀死了它的孩子之后runsv才真正运行该脚本。control/d您应该使用control/t脚本来清理。感谢@Keith 指出了这一点。