web-dev-qa-db-ja.com

スーパーバイザーを殺したときにスーパーバイザージョブの子プロセスが確実に終了するようにする方法

私のアプリは、いくつかの環境変数を必要とするjarファイルです。 1つのファイルにすべての環境変数があります。これは次のようになります。

export VAR=value
export VAR2=value2
#....etc

私のスーパーバイザー設定ファイルは次のようになります。

[program:programname]
command=bash -c "source /path/to/env/file && Java -jar /path/to/jar.jar"

ps -ef | grep programnameは、2つの別々の行に2つのプロセスを示しています。1つはbash -c "source blah && Java blah"で、もう1つはJava blahです。

ここで問題があります。supervisorctl stop programnameまたはservice supervisor stop、さらにはkill -9 whatever the supervisor pid isを実行しても、最初のプロセスは終了しますが、通常のJavaプロセスは残り、孤立し、親pidが1になりました。手動で強制終了せずにjarを強制終了するにはどうすればよいですか?

3
snetch

execを使用してbashJavaに置き換えます。

[program:programname]
command=bash -c "source /path/to/env/file && exec Java -jar /path/to/jar.jar"

このような場合、強制終了するプロセスは1つだけです。

3
mik

代わりに自分自身をJavaに置き換えるシェルスクリプトをコマンドにしますか?

#!/bin/bash
source /i/pity/da/env/foo
exec Java ...
2
thrig