2015年2月4日水曜日

Javaアプリケーションをログオフ中も実行させ続けるには

 Javaアプリケーションを、Windowsのサービスのように利用する(バックグラウンドでずっと実行させ続ける)ためには、通常のWindowsアプリケーションとは違った配慮が必要である。一般的には、Windowsのタスクとして登録しておけば、ユーザーのログオン/ログオフとは関係なく、プログラムを実行させ続けることができるはずである。だがJavaの実行環境の仕様により、たとえタスクとして登録されたプログラムであっても、ユーザーがログオフすると実行中のJavaアプリケーションのタスクが終了してしまう。これはJavaの実行環境が、ログオフに起因するシグナルをキャッチしてシャットダウンしてしまうからだ。

 Javaアプリケーションをログオン/ログオフとは無関係に、ずっと実行し続けたければ、このようなシグナルを無視するオプションを指定するとよい。Java実行環境1.3以降には「-Xrs」というオプションがあり、このオプションを付けて実行すると、ログオフ時のWindows OSによるシグナルを無視して実行を続けることができる。


操作方法
 例えば、次のようなJavaプログラムを作成したとしよう。

※ファイル:Count.java

public class Count {
public static void main(String[] args) throws Exception{
for (int i=0; ; i++){
Thread.sleep(1000);
java.io.FileWriter fw = new java.io.FileWriter("count.txt");
fw.write(Integer.toString(i));
fw.close();
}
}
}
 これは、起動からの経過時間をファイルに出力するプログラムである。実行中は1秒ごとにカレント・ディレクトリの「count.txt」が更新される。このファイルが更新されるかどうかを確認することで、プログラムが実行中かどうかを簡単にチェックできる。

 これをコンパイルし、「java Count」として実行すると、「count.txt」が作成され、1秒ごとに経過時間が書き込まれる。コマンド・プロンプトで「Ctrl+C」を押すか、ログオフするとプログラムは終了する。

 では、これをログオフ中も実行させるために、タスクとして登録してみよう。こうすると、ログオン/ログオフとは関係なく、実行されるようになる。

 まず、コントロール・パネルの[タスク]アイテムを開き、右クリックして表示されるポップアップ・メニュー、もしくは[ファイル]メニューの[新規]−[タスク]を選択する(コントロール・パネルをカテゴリ表示にしている場合には、[パフォーマンスとメンテナンス]の[タスク]アイテムを開く)。作成された新しいタスクに名前を付け、プロパティを開く。[実行するファイル名]は「javaw -Xrs Count」というふうに、-Xrsオプションを付けておく。その下の「開始」テキストボックスにはJavaプログラムを作成したフォルダ名を入力する。

 次に[スケジュール]タブをクリックし、タスクのスケジュールを「システム起動時」とする。

 以上の設定でタスクを登録し、コンピュータを再起動すると自動的にJavaが起動され、ユーザーがログオン/ログオフしても実行が続けられる(-Xrsオプションがないと、ユーザーがログオフすると、プルグラムが終了してしまう)。終了するには[タスクの終了]を実行すればよい。

 なお、「-X」で始まるオプションは非標準であり、バージョンアップに伴って変更される可能性がある。利用の際には、あらかじめ「java -X」などでXオプションが利用できることを確認していただきたい。