2012-03-20 30 views
5

私の問題は簡単です、Javaから.shスクリプトを実行しようとすると、スクリプトは実行しません。私のスクリプトをls -allのような単純なlinuxコマンドに変更すると、それは完璧に動作するので、私のスクリプトでは実行を停止する悪いコマンドを使っていると思います。助けてください。Javaからの実行中のbashスクリプト

デビッド

Javaコード:

String cmd = "bash /home/david/burza/getter.sh"; 

    try { 
     Process proc = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", cmd}); 
     BufferedReader read = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
     try { 
      proc.waitFor(); 
     } catch (InterruptedException e) { 
      System.out.println(e.getMessage()); 
     } 
     while (read.ready()) { 
      System.out.println(read.readLine()); 
     } 
    } catch (IOException e) { 
     System.out.println(e.getMessage()); 
    } 

bashスクリプト:コマンドの開始から 'bashの' を除去することにより、

#! /bin/bash 

wget -O data1.html http://www.rmsystem.cz/kurzy-online/akcie/easyclick; 
touch ext_data.txt; 

grep 'table class="tbl1"' ./data1.html | tr '<td>' ' ' | tr '-' 'A' | grep -o -w '[0-9, ]*' | sed 's/ *//g' | sed '/^$/d' | tr ',' '.' > ext_data.txt; 

lines=`wc -l ext_data.txt | grep -o '[0-9]*'`; 

(echo $lines; cat ext_data.txt) > ext_data.txt.new && mv ext_data.txt.new ext_data.txt; 
+0

あなたのスクリプトは実行可能ファイルとして設定されていますか?多分chmod + x script.shは助けることができる – Kiwy

+0

あなたは何を得ると思いますか?シェルスクリプトはstdoutに何も表示しないので、すべての出力をファイルにリダイレクトします。次にBufferedReaderは何ですか? – zserge

+0

これは愚かなコードで、入力ストリーム、出力ストリーム、エラーストリーム用に3つのスレッドを作成し、インタラクティブに実行すると、すべての種類の問題からあなたを救うことができます –

答えて

2

スタート。

第2に、シェルが#を行うかどうかわかりません!対話的に使用されない場合の解釈。私はRuntime.exec()呼び出しのために/ bin/bashに直接ジャンプすることに気をつけます。

最後に、単に標準出力に存在するリーダーを持つだけでは十分ではありません。あまりにも多くの出力を書き込む場合、プロセスがハングするのを防ぐために、stderrから積極的に読む必要があります。明確にするために、出力を処理する前にプロセスが完了するのを待っています(proc.waitFor())。プロセスが終了する前にあまりにも多くの出力を書き込むと、ブロックされている間にバッファを空にして終了するのを待ってブロックされます。

この記事の全4ページを読む:http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

+0

あなたのアドバイスに感謝し、http:// www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1ありがとうございました。 – dawe134