56

アプリケーションにシャットダウン フックがあります (を使用して作成Runtime.getRuntime().addShutdownHook)。ただし、Eclipse 内からアプリケーションを起動すると、シャットダウン時にシャットダウン フックが実行されません。

これは、Eclipse が強制終了シグナルに相当するものをプロセスに送信し、シャットダウン フックが実行されないためだと思います (Windows の taskkill /F または Linux の kill -p に相当します)。絶対にわからない。

これを回避する方法を知っている人はいますか?Windows (Vista) を実行していますが、Windows 固有の問題である可能性があると感じていますが、よくわかりません。

4

7 に答える 7

24

この問題を回避するために、メイン メソッドの最後に次のハックを使用しました。

if (Boolean.parseBoolean(System.getenv("RUNNING_IN_ECLIPSE"))) {
    System.out.println("You're using Eclipse; click in this console and " +
            "press ENTER to call System.exit() and run the shutdown routine.");
    try {
        System.in.read();
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.exit(0);
}  
于 2009-03-11T23:37:05.390 に答える
12

まず、アプリケーションを終了しますか、それとも強制的に終了しますか? (停止ボタンを使用して) 強制的に終了している場合、このEclipse バグ レポートには、これが機能しない可能性がある理由の詳細が記載されています。

それができない場合は、これが Windows 固有の動作であることについて正しいかもしれません。Macなので確認できません、すみません。ただし、次のテスト プログラムで、シャットダウン フックが期待どおりに実行されることがわかります。

public class MyShutdownHook
{
    public static void main( String[] args )
    {
        System.out.println( "Entering main." );

        Runtime.getRuntime().addShutdownHook( 
            new Thread(
                new Runnable() {
                    public void run() {
                        System.out.println( "Shutdown hook ran." );
                    }   
                }
            )
        );

        System.out.println( "Exiting main." );
    }
}

Runtime#addShutdownHookの Javadoc には、JVM が正常に終了せずに中止された場合にシャットダウン フックが実行されないことが記載されているため、おそらく想定は正しいでしょう。そうは言っても、試してみるべきことがいくつかあります。繰り返しますが、申し訳ありませんが、これらを事前に確認することはできません。ここには Windows はありません。(幸いなことに!)

  • JVM に-Xrsオプションが含まれていないことを確認してください。これは、シャットダウン フックに副作用があります。
  • -serverまたは-clientオプションを使用して JVM を起動してみてください。VM モードの選択によってエッジケースの動作が影響を受ける可能性があることは、私の経験から言えます。(特にスレッドに関して -- 少なくとも Mac では。)
  • プロファイラーなどでアプリを起動していますか? ネイティブ ライブラリをロードしていますか?
  • 致命的なエラーが発生し、見逃していませんか? たとえば、OutOfMemoryError などですか?
  • Eclipse でアプリケーションの[実行構成] ダイアログから [バックグラウンドで起動] オプションをオンまたはオフにしてみてください。
  • 最後になりましたが、機会があればSystem.exit()を手動で呼び出してください。:)
于 2009-02-18T03:24:33.167 に答える
5

以下は、Eclipse の外部で実行できるスクリプトで、Eclipse で実行されているプロセスのうち、強制終了できるものを一覧表示します。

#!/bin/bash
set -o nounset                              # Treat unset variables as an error

PROCESSES=$(ps axo pid,ppid,command)

# Find eclipse launcher PID
LAUNCHER_PID=$(echo "$PROCESSES" | grep "/usr/lib/eclipse/eclipse" |grep -v "launcher"|awk '{print $1}')
echo "Launcher PID $LAUNCHER_PID"

# Find eclipse PID
ECLIPSE_PID=$(echo "$PROCESSES" | egrep "[[:digit:]]* $LAUNCHER_PID " | awk '{print $1}')
echo "Eclipse PID $ECLIPSE_PID"

# Find running eclipse sub-process PIDs
SUB_PROCESS=$(echo "$PROCESSES" | egrep "[[:digit:]]* $ECLIPSE_PID " | awk '{print $1}')

# List processes
echo
for PROCESS in $SUB_PROCESS; do
    DRIVER=$(ps --no-headers o pid,ppid,command $PROCESS | awk '{print $NF}')
    echo "$PROCESS $DRIVER"
done

echo "Kill a process using: 'kill -SIGTERM \$PID'"
于 2012-03-23T01:35:17.643 に答える
1

これを修正する方法はわかりませんが、IntelliJ は、シャットダウン フックを呼び出す方法で VM をシャットダウンする別のボタンを [実行] ダイアログに追加しました。彼らのデバッガにはこの機能がありません。

于 2009-02-13T19:07:31.363 に答える
0

私は現在 websphere で立ち往生しており、探しているものが表示されません。しかし、Eclipse には、同じ VM でのアプリケーションの起動に関連する実行構成オプションがあったことを覚えています。Eclipse VM と同じ VM で Java アプリケーションを起動することは可能ですか?

しかし、そのオプションは私の心を滑らせます。

于 2009-02-18T06:29:38.900 に答える
0

Sairam はここにあります。System.exit(0)を呼び出すことで、Eclipse JVM を終了し、Shutdown フックの結果を確認できます。

于 2015-09-25T08:37:06.240 に答える