waitFor
が使用されていない場合、JVMを強制終了しても子プロセスには影響しません。ここに例があります。waitForを使用している場合、JVMを強制終了すると子プロセスも終了するのはなぜですか?
bashスクリプト:
#!/usr/bin/env bash
echo "Sleeping..." > 'log'
sleep 30
echo "Wake up" >> 'log'
Javaコード:Java Code
後
public class Code {
public static void main(String[] args) throws Exception {
Process process = Runtime.getRuntime().exec("./child.sh");
// process.waitFor();
}
}
が発行され、JVMはすぐに終了します。そしてps -ef | grep 'child.sh' | grep -v grep
ショー:
jing 3535 2761 0 13:47 pts/15 00:00:00 bash ./child.sh
は、その後30秒後に、私は現在のディレクトリにlog
ファイルの内容を確認してください。内容は次のとおりです。
Sleeping...
Wake up
そして上記のgrep
コマンドは何も表示されません。今度はprocess.waitFor()
をコメント解除し、Code.java
を再コンパイルします。 java Code
を実行した後、上記のgrep
コマンドを使用して、child.sh
子プロセスが実行されていることを確認します。次にCtrl-C
を発行し、JVMを終了します。上記のgrep
コマンドを実行すると、何も表示されません。私はこの動作を説明していませんProcess
のJavadocをチェックした
Sleeping...
:ようとlog
ファイルの内容が残ります。次に、次のコードを使用して、fork
、execlp
、およびwaitpid
システムコールの動作を確認します。そしてそれは同じ振る舞いを示しています。
私はOracle JDK 1.8をUbuntu 14.04で使用しています。 uname -a
が生成する:
Linux jinglin 3.13.0-108-generiC#155-Ubuntu SMP Wed Jan 11 16:58:52 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
誰もがwaitFor
とwaitpid
のこの効果についての説明を与えることができますか?
Does Process.waitFor() make the process reliant on the java parent?は、MACプラットフォームで同様の問題を尋ねます。しかしそれは詳細が欠けている。だから私はここで私の環境のためにこの質問をする。
本当ですか?制御端末は、関連する3つのプロセスすべてで同じであり、決して閉じません。 –
真。しかし、どのようにそれらが終了するのですか? – Ingo
カーネルは、端末内のセッションのフォアグラウンドプロセスグループにSIGINTを送信します。 –