2012-03-20 285 views
5

我的問題很簡單,當我嘗試從Java運行.sh腳本時,腳本不執行。如果我將腳本更改爲一個簡單的linux命令(例如ls -all),它可以很好地工作,所以我想我的腳本中使用了一個錯誤的命令,這會停止執行。請幫忙。從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腳本:

#! /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 2012-03-20 16:52:34

+0

你期望得到什麼?你的shell腳本不會輸出任何標準輸出,它將所有輸出重定向到文件。那麼什麼是BufferedReader? – zserge 2012-03-20 17:07:32

+0

這是一個愚蠢的代碼,爲輸入,輸出和錯誤流編寫3個線程並以交互方式執行,這將爲您節省各種麻煩 – 2013-03-07 10:44:20

回答

2

開始通過從命令開始的 '慶典'。

其次,我不確定shell會做#!沒有交互使用時的解釋。我會心甘情願地爲Runtime.exec()調用直接跳到/ bin/bash。

最後,僅僅在stdout上有一個閱讀器是不夠的。你需要積極地閱讀它,並從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 2012-04-05 22:13:46