web-dev-qa-db-ja.com

runitは、svstopまたはsvreloadでプロセスを強制終了しません

aMILinuxボックス上のjenkinsサーバーに沿ってヘッドレスSeleniumプロセスを実行しています。これらはすべてrunitによって管理されています。

問題は、「svstopSelenium」または「svreloadSelenium」を発行しても、子プロセスに沿って古いインスタンスが終了または強制終了されるのではなく、runsvプロセスから切り離されるだけなので、runitがそれらを認識せずに実行を継続することです。再起動に失敗した場合は、サービスを試してください。

私の質問はこれに関連していると思います: runitカスタム停止スクリプトの書き方

意味:手動でクリーンアップするために、おそらくカスタム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
2
Andreas Wagner

Chpstコマンドラインに-Pを追加すると、chpstはサービスの新しいプロセスグループを作成します。次に、カスタムの「d」スクリプトでpidを読み取り、-TERM -pidを強制終了して、プロセスグループ全体にTERMシグナルを送信できます。

これは、子プロセスが独自のプロセスグループを作成しない限り機能するはずです。

ただし、xvfbとJavaを別々に開始する方がクリーンな場合があります(これらを2つのrunitサービスに分割します)。

3
András Korn