- PR -

外部コマンドの実行について

1
投稿者投稿内容
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2004-03-29 14:42
みーちくと申します。

Javaからshを実行するために、メソッドを作成致しました。
for文で4回実行するのですが、最初の1回目の処理は1秒位で終了するのですが、
残り3回の処理は平均で46秒位かかってしまいます。
なにが、原因なのかわかりません。

【実行環境】
RedHat7.2
java version "1.4.1_01"

【時間】
終了コード: 0
検索ディレクトリ: /raid1/dtp/content/a/a00/a0002/a0002-00-0
終了時間:Mon Mar 29 14:03:41 JST 2004

終了コード: 0
検索ディレクトリ: /raid2/dtp/archive/a/a00/a0002/a0002-00-0
終了時間:Mon Mar 29 14:04:27 JST 2004

終了コード: 0
検索ディレクトリ: /raid1/dtp/content/a/a00/a0002/a0002-00-0
終了時間:Mon Mar 29 14:05:13 JST 2004

終了コード: 0
検索ディレクトリ: /raid2/dtp/archive/a/a00/a0002/a0002-00-0
終了時間:Mon Mar 29 14:05:59 JST 2004

コード:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;


/**
 * 作成日: 2004/03/16
 * 
 */
public class Process_Check {

	public static void main(String[] args) {
		// 4件のテスト
		Process_Check ch 	= new Process_Check();
		String[][] search 	= {
			{"/home/dtp/RSH/list_main.sh", "/raid1/dtp/content/a/a00/a0002/a0002-00-0", "1", "0", 
				"/home/dtp/bin/Admin_jsp/last/test_create.html"},
			{"/home/dtp/RSH/list_main.sh", "/raid2/dtp/archive/a/a00/a0002/a0002-00-0", "1", "0", 
				"/home/dtp/bin/Admin_jsp/last/test_stock.html"},
			{"/home/dtp/RSH/list_main.sh", "/raid1/dtp/content/a/a00/a0002/a0002-00-0", "2", "0", 
				"/home/dtp/bin/Admin_jsp/last/test_create.txt"},
			{"/home/dtp/RSH/list_main.sh", "/raid2/dtp/archive/a/a00/a0002/a0002-00-0", "2", "0", 
				"/home/dtp/bin/Admin_jsp/last/test_stock.txt"},
		};
		for(int i=0; i<search.length; i++){
			ch.File_Search(search[i][0],search[i][1],search[i][2],search[i][3],search[i][4]);
		}
	}

	/**
	 * 外部コマンドの実行
	 *
	 * @param paramName1 shのパス
	 * @param paramName2 検索対象ディレクトリ
	 * @param paramName3 処理フラグ[1]ディレクトリ階層取得
	 * @param paramName4 リダイレクトをするかどうか 0:する 1:しない
	 * @param paramName5 ファイルのリダイレクト先
	 */
	public void File_Search(
		String paramName1, String paramName2, String paramName3, String paramName4, String paramName5) {
		Runtime rt 			= Runtime.getRuntime();
		Process pr 			= null;
		String[] command 	= new String[5];
			command[0] 		= paramName1;
			command[1] 		= paramName2;
			command[2] 		= paramName3;
			command[3] 		= paramName4;
			command[4] 		= paramName5;
		try{
			// 指定された文字列コマンドを、独立したプロセスで実行
			pr = rt.exec(command);
			pr.waitFor();
			int end = pr.exitValue();
			System.out.println("      終了コード: " + end);
			System.out.println("検索ディレクトリ: " + paramName2);
			System.out.println("        終了時間:" + new java.util.Date());
			System.out.println();
		}catch(Exception e){
			e.printStackTrace();
		} finally {
			pr.destroy();
			pr 		= null;
			command = null;
		}
	}
}




皆様、宜しくお願い致します。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-03-30 10:21
unibon です。こんにちわ。

引用:

みーちくさんの書き込み (2004-03-29 14:42) より:
for文で4回実行するのですが、最初の1回目の処理は1秒位で終了するのですが、
残り3回の処理は平均で46秒位かかってしまいます。


あまりよくは分かりませんが、原因の可能性を2つ思いつきました。
(1) 1回目の処理が1秒では終わっていない可能性があります。単に起動が完了しただけで、処理は完了していないのかもしれません。そして2回目の処理と競合してしまっているのではないでしょうか。Java から exec したプロセスがさらに別のプロセスを exec しているということはないでしょうか。
(2) プロセスの exec 絡みの問題の多くは、標準出力(や標準入力、標準エラー出力)などのハンドリング絡みです。外部プロセスがなにか、標準出力や標準エラー出力に出力しているでしょうか。あまり量が多いと、外部プロセスを起動した Java の側で読み出さないとブロックしてしまうことがあります。
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2004-03-30 12:21
unibonさん

返信ありがとうございます。

>(1) 1回目の処理が1秒では終わっていない可能性があります。
>単に起動が完了しただけで、処理は完了していないのかもしれません。
>そして2回目の処理と競合してしまっているのではないでしょうか。
>Java から exec したプロセスがさらに別のプロセスを exec
>しているということはないでしょうか。

もう少し、詳しい説明をしますと、shのプログラムはあるJavaのファイルを起動しております。
そのJavaのファイルはディレクトリ情報の検索をし、HTMLのタグを標準出力しております。
sh側ではその標準出力したものを、リダイレクトしております。
Linux上でプロセスの実行を見ながら処理の流れを見ていたのですが、
1回目のプロセスはちゃんと正常に終了しておりました。
2回目以降のプロセスはやはり、46秒位かかっておりました。

[処理の流れ]
Aプログラムよりshを起動
    ↓
shよりBプログラムを起動
    ↓
Bプログラムよりディレクトリ情報を検索し、HTMLタグを標準出力
    ↓
shより、標準出力したものをリダイレクト
    ↓
Aプログラムより終了コードを取得

>(2) プロセスの exec 絡みの問題の多くは、標準出力(や標準入力、標準エラー出力)などの
>ハンドリング絡みです。
>外部プロセスがなにか、標準出力や標準エラー出力に出力しているでしょうか。
>あまり量が多いと、外部プロセスを起動した Java の側で読み出さないと
>ブロックしてしまうことがあります。

[処理の流れ]のBプログラムで、ディレクトリ情報をhtmlタグ付きで標準出力しております。
ディレクトリによっては、かなり標準出力の量が多くなっております。
ここら変があやしいのでしょうか。
また、pr.waitFor(); でコマンドの終了を待って、int end = pr.exitValue(); で
終了コードを取得しているのですが、この終了コードは当てにはならないのでしょうか。
プロセスを見る限り、終了しているのみたいなんですが。

宜しくお願い致します。
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-03-31 01:31
勘なんで、外してたらごめんなさい m(__)m

Javaと無関係に、単にBプログラムを繰り返し実行した場合に遅くなるという
可能性は無いですか?

1

スキルアップ/キャリアアップ(JOB@IT)