我正在 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/d
control/t