20

これに似たbashスクリプトにコマンドがあります:

eval "( java -classpath ./ $classname ${arguments[@]} $redirection_options $file )" &
pid=$!

ただし、ps $pid実行すると、Java プログラムのプロセスではなく、メイン スクリプトのプロセスが表示されます。

eval を省略すると正しいプロセスが得られますが、複雑な引数の一部を正しく機能させるには、それを使用する必要があります。

eval コマンド内で実行されたときに、Java プログラムの PID を取得する方法について何か考えはありますか?

4

1 に答える 1

36

アンパサンドがeval行をバックグラウンド化しているため、(トップレベル) シェルが子をフォークし、子シェルがeval文字列に分岐し、Java プログラムがトップレベル シェルの孫として実行されます。そのため、$!最近バックグラウンド化されたコマンドである子シェルの pid を報告します。

代わりに、バックグラウンドを eval 内に移動します。

eval "(java ...) &"
pid=$!

括弧がsubshel​​lになるほど複雑にならない限り、上記は機能します。

于 2010-12-02T21:17:24.747 に答える