• ベストアンサー

シャットダウンフックが呼ばれない

Runtime#addShutdownHook(...) を利用して、 PCのシャットダウン時刻をファイルに保存するプログラムを作成しています。 ところが、Windowsのログオフやシャットダウンを選択しても、シャットダウンフックが呼ばれないことがあります。 OS Windows XP SP2 JVM Sun 1.4.2_08-b03 ただし、該当のプログラムを java で起動したときは正しくシャットダウンフックが呼ばれて、終了時刻が保存されています。 javawで起動したときだけシャットダウンフックが無視されます。 コンソールやウィンドウを表示させずに動かしたいのでjavawにしたのですが、何かいい方法はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんばんは。 >java で起動したときは正しくシャットダウンフック >が呼ばれて、終了時刻が保存されています。 >javawで起動したときだけシャットダウンフックが >無視されます。  試してみたら、確かにjavawではシャットダウンフックが呼ばれませんねぇ。  でも、FrameやJFrameを使ったGUIアプリケーションの場合は呼ばれているみたいです。  あてずっぽうなんですが、javawではイベントディスパッチスレッドの有無が関係してシャットダウンフックが呼ばれたり呼ばれなかったりするんじゃないでしょうか。  こうすると↓javawでもシャットダウンフックが呼ばれるみたいです。  ちなみにJ2SE 1.5.0_02 で試しました。 import java.util.*; import java.io.*; public class ShutdownHookTest {   public static void main(String[] args) {     Runtime.getRuntime().addShutdownHook(new Thread() {       public void run() {         PrintWriter pw = null;         try {           pw = new PrintWriter(new FileWriter("log.txt", true));           pw.println(new Date());         }         catch (IOException ex) {}         finally {           if (pw != null)             pw.close();         }       }     });          java.awt.Frame frame = new java.awt.Frame();     frame.pack();     //↑Frameを表示させずに、イベントディスパッチスレッドを動かすためのpack()     //ここをコメントアウトするとシャットダウンフックがかからない。          try {       while (true) {         Thread.sleep(10000);       }     }     catch (InterruptedException ex) {}   } }  しかし、回避策とは言え、表示させもしないFrameを作るのはなんともかっこ悪いです。  やはり、コマンドプロンプトを表示させずにjava.exeを呼ぶことを考えたほうがいいのかもしれません。  でも、いい方法が思いつきません。  それにしても、この症状はJVMのバグなんでしょうか?  それとも仕様なんでしょうか?  変ですね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • kyrsche
  • ベストアンサー率41% (7/17)
回答No.4

javawとShutdownHookで検索するとそれらしいネタが(^^; まとめると、Windowsではウィンドウの終了時(多分ログオフ時も一緒)に 終了してよいかどうかの問い合わせメッセージを「ウィンドウ」に対して行うので、 コンソールを持たないjavawではそのメッセージを受け取れず、 shutdownHookが呼び出されない、ということになります。 なので、javawを使うのであればRuntime#addShutdownHook以外の方法を考える しかなさそうですね。 #GUIがある場合は、addShutdownHookでも大丈夫そうですが。 対策としてはちょっと思いつきません。 #C++でWindowsのネイティブプログラムを組めば何とかなりそうですケド・・・

thamansa
質問者

お礼

ありがとうございます。 ちゃんと検索せずに質問してしまってすみません。

全文を見る
すると、全ての回答が全文表示されます。
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.3

 またまた、訂正です。  よく考えたら、最後の try {   while (true) {     Thread.sleep(10000);   } } catch (InterruptedException ex) {}  これは必要なかったですね。  せっかくイベントディスパッチスレッドを動かしたんだから、何もメインスレッドまでぐるぐる待機させる必要なかったです。  たびたび、すみません。

thamansa
質問者

お礼

ありがとうございます。 コンソールもGUIも無いと終了するのに困ってしまうので、とりあえずタスクトレイにアイコン表示して、SWTのaddDisposeListener()で終了時のイベントハンドラを使うようにして解決できました。

全文を見る
すると、全ての回答が全文表示されます。
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 すみません。  ちょっと訂正です。 >試してみたら、確かにjavawではシャットダウンフックが呼ばれませんねぇ。    ↓ 試してみたら、確かにjavawではWindowsのログオフやシャットダウンではシャットダウンフックが呼ばれませんねぇ。  プログラム自身が終了する場合では、javawでもシャットダウンフックが呼ばれるのは、こちらでも確認できまた。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • シャットダウン

    パソコンは良くわからないのですが OSはXPです いろいろいじってたら  立ち上げるたびに シャットダウン データーを保存します ログオフ で 30秒ぐらいで自動的に再起動します 何回やっても シャットダウン 再起動の繰り返しで 何も出来ません シャットダウンの キャンセルか削除みたいなものが あったらおしえてください 宜しくお願いします

  • javaの文字コード変換表はどこに保存されているの?

    javaの文字コード変換表はどこに保存されているの? SunのJavaの文字コード変換表はどこに保存されているのでしょうか?書き換えたいんですが、SunのJVMはオープンソースなので書き換え可能ですよね?

    • ベストアンサー
    • Java
  • システムのシャットダウン

    Internet Explorerを開いて接続(@FREED使用)して1~2分ほど経つとシステムのシャットダウンというダイアログボックスが出てきて強制終了(?)してしまいます。 内容は下の通りです。カウントが0になると再起動してしまいます。 どうしてこうなったのかわかりません(>_<) 昨日は使っていませんが、おとといは普通に使えていました。 今日突然なってしまい、再起動しても同じことの繰り返しです。 誰か助けてください、よろしくお願いします。m(__)m ―――――――――――――――――――――――― システムのシャットダウン × システムはシャットダウンされます。進行中の作業をすべ て保存し、ログオフしてください。保存されていない情報 は失われます。シャットダウンは、NT AUTHORITY\SYSTEMによって開始されました シャットダウンまで:00:00:59 メッセージ Remote Procedure Call(RPC)サービスが異常終 了したためWindowsを再起動する必要があります。 ――――――――――――――――――――――――

  • シャットダウン

    WINDOWS終了時にシャットダウンを選択しても 再起動と同じ状態になってしまいます (ログオフはまともに動く) どうすれば正常に動作するようになりますか? よろしくお願い致します。

  • シャットダウンするときに

    友人のPCについてなんですが、 とても動作が遅いんです。 ネットをするにしてもファイルを開くにしても 起動したり、シャットダウンするときも遅いんです。 色々早くなるようなことを試してみたんですが 思うように早くなりません。 動画などが大量に保存されているとかそういうこともないです。 しかし、今一番気になっていることがあって シャットダウンするときに hkcmd.exe プログラムの終了中です お待ちください。 SMax4PNP プログラムの終了中です お待ちください。 TPSBattMWindow プログラムの終了中です お待ちください。 RAMAsst プログラムの終了中です お待ちください。 conime.exe プログラムの終了中です お待ちください。 ctfmon.exe プログラムの終了中です お待ちください。 とメッセージが続きます。 遅いのはこれらが原因なのかなーと思っていますが 対処法があれば教えてくださると助かります。 これらは一応 http://process.a-windows.com/ で調べてみました。

  • PCを指定した時刻に自動でシャットダウンさせたい

    こんにちは。 PCを指定した時刻に自動でシャットダウンさせたいのですが どのようにすればよいのでしょうか? なおかつ、シャットダウンするときに再起動とかサスペンド を選択させることなく、強制的にシャットダウンさせる 必要があります。 コントロールパネルのタスクでやろうかと思ったのですが、 該当する項目が見当たりませんでした。 よろしくお願いいたします。

  • VBからシャットダウンさせる方法

    VBのプログラムから、強制的にWINDOWSをシャットダウンさせるにはどうすればよいでしょうか。 (長時間の処理が終了した後、又は、指定した時刻を過ぎたら自動的にシャットダウンさせたい) VB6.0、OSはWindowsXPです。

  • 使用中にシャットダウンする

    WindowsXPで使用中(時間はその時により異なる にいきなりシャットダウンします。 ・設定を保存しています ・windowsをシャットダウンします Linuxで起動した場合はログオフ状態になる MS-DOSで起動した場合は電源断となる 恐らくBIOSの問題なのかと思いますが、 原因と回復方法が特定できません。 原因究明のヒントを教えてください。 マザーボード(MSI-845PE Max3)の自作機です

  • 強制シャットダウン無効方法

    普通にインターネットを利用していると下記のメッセージが現れ、パソコンが強制にシャットダウンされました。 「システムはシャットダウンされます。進行中の作業をすべて保存し、ログオフしてください。保存されていない情報は失われます。シャットダウンは NT AUTHORITYSYSTEMによって開始されました シャットダウンまで:****** Remote Procedure Call(RPC)サービスが異常終了したためWindowsを再起動する必要があります。」 強制シャットダウンを無効にする方法は、ありますか?

  • カウントダウンが始まりシャットダウンしてしまいます(@_@;)

    ネットにつないでいると突然、  『システムのシャットダウン  システムはシャットダウンされます。進行中の作業 をすべて保存し、ログオフしてください。保存され ていない情報は失われます。シャットダウンは NT  AUTHORITY\SYSTEM によって開始されました。  シャットダウンまで 00:00:59』 となって勝手に再起動してしまいます。自分なりにいろいろ調べてみて、"ファイル名を指定して実行"のところでshutdown -aとするととりあえずはこの表示が消えるのですが電源を切ってまたつけるとまたシャットダウンしてしまうのです。根本的には何も解決していない状態なのでわかる方教えていただけると大変助かります。

このQ&Aのポイント
  • 私の家庭環境が理由で、婚約者の両親から結婚を反対されてしまわないか不安です。相手の親にはどのくらい伝えておくものなのでしょうか。
  • 私は4人家族の長女で、父は無職で母とは別居、弟はアルバイト暮らしです。私には将来的に父、母、弟全員の面倒を見る可能性があり、恋人の両親にとっては不安材料になると思います。
  • 恋人は気にしないと言っているが、親には詳細を伝えないつもりだとしています。弟には状況改善の余地があるが、資格もなく持病もあるため体力勝負の仕事には就けません。私は彼にアドバイスをして支援しましたが、結局就職できませんでした。
回答を見る

専門家に質問してみよう