上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- / Top↑
Javaプログラムの中からコマンド発行できます。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
Javaプログラミングmini-tips-0004【コマンドを独立プロセスで実行】
-----------------------------------------------------------------
知っていると便利?いつかは役立つ?……かも知れないTIPsです。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Javaプログラムの中から別建てで色々と処理が起動できればいいなと思った事はないですか?

この命令を使用すれば自分のプロセスとは別建てコマンド発行やプログラムの起動が出来ます。


<お断り>
・Javaコードはバージョンによって使用に影響を受ける可能性があります。
 (バージョンによって未サポートのためエラーとなるコードも存在します)
・当サンプルはEclipse使用前提のためimportステップは省略しています。


---------------------------------------------------------------------
指定された文字列コマンドを独立プロセスで実行(CentOS[bash]例)
---------------------------------------------------------------------
//*******************************************************************
//* パターン1
//*******************************************************************
String[] cmd = { "bash", "-c", "ls -1 > test.txt" };
//String[] cmd = { "gedit", "Test.txt" };
try { Runtime.getRuntime().exec(cmd); }
catch(IOException e) { System.out.println("起動エラーです="+e.getMessage()+"]"); }

//*******************************************************************
//* パターン2
//*******************************************************************
//String[] cmd = { "bash", "-c", "ls -1 > test.txt" };
String[] cmd = { "gedit", "Test.txt" };
ProcessBuilder pb = new ProcessBuilder(cmd);
Process process = null;
try { process = pb.start(); } catch (IOException e) {System.out.println("ERR1");}
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
try { while ((line = br.readLine()) != null){ System.out.println( line); } }
catch (IOException e) {System.out.println("ERR2");}
try { is.close(); } catch (IOException e) {System.out.println("ERR3");}
try { int ret = process.waitFor(); }
catch (InterruptedException e) {System.out.println("ERR4");}


それぞれRuntime文の中の .exec()の括弧の中に必要なコマンドを文字列で記述します。(指定コマンドはOS毎に異なります)

<<<geditパターン>>>>>>>
上記例のexec("gedit", "Test.txt")はgeditの起動です。geditはGNOMEデスクトップ用に作られたテキスト・エディタです。この場合、Test.txtを開きながら別画面(Window)でgeditが立ち上がります。(Test.txtファイルがなければ空白画面で立ち上がります)

<<<bashパターン>>>>>>>
上記例のexec(""bash", "-c", "ls -1 > test.txt")はbashでのコマンド起動例です。ls は メンバー一覧をtest.txtに吐き出しているだけです。Test.txtファイルがなければ新規作成されますし、存在すれば上書きされます。


---------------------------------------------------------------------
コメント
---------------------------------------------------------------------
上記での起動例は、CentOSでの例です。これはLinux(bash)系で使うコマンドですので、Windowsなど他OSでは其々のOS用コマンドの指定になります。

コマンドが実行されるカレントフォルダはプログラムが動作しているフォルダになるようです。

パターン1は短ステップで起動できるので便利かもしれません。

パターン2は新しめなJavaバージョンで使った方がいいようですが、私はステップが少ないのでパターン1をどうしても多用しています。

gedit例は画面起動を伴うような処理、bash例はコマンドを起動したい場合の処理です。他のコマンドでも同様に指定するとよいかと思います。それぞれコマンドを文字列の配列で指定していますが、これらの指定は動作しない場合もあり得ますので、実際は動作テストをしながらの設定になります。「bash -c」の部分は普段はあまり気にしていない所ですが、Javaプログラム中からコマンド発行ではパスが制限されるのか?意識してやらないとコマンドが動作しないようです。

それぞれtry文で挟まれる部分がありますが、これらは頭(クラス単位)でスローしてやればスッキリしますが、エラーが全く見えなくなる可能性もあって危険なので私は控えた方がよい気がします。

画面起動を伴うコマンド(プロセス)は起動が掛かってからローディングして立ち上がるまで物によってタイムラグが目立ちますので。自プログラムの処理タイミングに絡むような起動(連動)はなるべく避けた方がよいのかも知れません。

起動できるコマンドは1つだけのようです。(;でコマンドは繋げられない)

実際に起動できないコマンドの場合(コマンド無しやエラーで立ち上がれない等)は見た目では何も動いていない状態になります。この命令を使用する時は、起動タイミングやエラー時の対処など、別プロセスで動く処理であることを十分認識した上で起動・運用管理させなければなりません。


--- 以上 ---


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
当作業の実行環境
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
◆オペレーティングシステム:CentOS release 5.9 (Final) CPU:32bit メモリ:512MB
◆Java SE Development Kit 8
(JREの環境)
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode, sharing)
2014.10.05 / Top↑
Secret(管理者にだけ表示を許可する)


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。