Service

runit 不會在 sv stop 或 sv reload 時終止程序

  • January 28, 2022

我在 AMI linux 機器上的 jenkins 伺服器上執行一個無頭硒程序,全部由 runit 管理。

問題是發出“sv stop selenium”或“sv reload selenium”並不會終止或終止舊實例及其子程序,而只是將它們從runsv程序中分離出來,因此它們在runit不知道它們的情況下繼續執行,導致在服務的失敗重新啟動嘗試中。

我認為我的問題與此有關: How to write runit custom stop script

含義:我可能應該嘗試自定義 d 控制腳本,以便手動清理。

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

但是,從 /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

如果您在 chpst 命令行中添加 -P,則 chpst 將為您的服務創建一個新的程序組。然後在您的自定義“d”腳本中,您可以讀取 pid 並 kill -TERM -pid 將 TERM 信號發送到整個程序組。

只要沒有子程序創建自己的程序組,這應該可以工作。

但是,單獨啟動 xvfb 和 java 可能會更乾淨(將它們分成兩個 runit 服務)。

編輯:顯然runsv手冊頁具有誤導性;只有在它已經殺死了它的孩子之後runsv才真正執行腳本。control/d您應該使用control/t腳本進行清理。感謝@Keith 指出這一點。

引用自:https://serverfault.com/questions/612458