2015-06-10 47 views
0

使用Java代碼來啓動HBase的主,我們通過下面的代碼如何在Ubuntu

#!/bin/sh 
/home/burhan/hbase-0.94.15/bin/start-hbase.sh 
/home/burhan/hbase-0.94.15/bin/hbase shell 

上面的代碼是通過使用終端成功運行和HBase的開始做了一個.bat文件。但是當我們在eclipse中使用java運行bat文件時,它不起作用。爲什麼?

我們用Java編寫下面的代碼在Eclipse:

Process p; 
p=Runtime.getruntime().exec("sh -c /home/burhan/bat.sh"); 

回答

0

當您使用sh-c選項,這意味着要傳遞的命令作爲一個字符串,而不是一個shell文件。 因此,語句sh -c /home/burhan/bat.sh意味着/home/burhan/bat.sh是您要執行的命令,而不是您要執行的文件。

所以運行該文件刪除-c說法,

p=Runtime.getruntime().exec("sh /home/burhan/bat.sh"); 
+0

它不工作.. PLZ建議另一種方式.. – BURHANUDDIN

+0

是否拋出任何錯誤?你檢查過'p'的'outputstream'和'errorstream'嗎? – Codebender

+0

no ... bt在我們編寫時顯示以下輸出:'System.out.println(p);' '[email protected]' – BURHANUDDIN

0

你調用exec(字符串命令),這是一個方便的方法。

表單exec(command)的調用與調用exec(command,null,null)的行爲方式完全相同 。 from the Runtime documentation

即(exec(String command,String[] envp, File dir))反過來行爲完全相同的方式調用exec(String[] cmdarray, String[] envp,File dir),其中cmdarray是命令所有的令牌的陣列。

命令字符串使用由調用new StringTokenizer(command)創建的StringTokenizer分解爲令牌,而不進一步修改字符類別。令牌生成器生成的令牌隨後以相同的順序放置在新的字符串數組cmdarray中。

所以你的命令"sh -c /home/burhan/bat.sh"得到一個空目錄,因此子進程繼承了當前進程的當前工作目錄。

我相信你需要的地方組織你的命令的線沿線的:

String[] commands = new String[] { "sh", "-c", "/home/burhan/bat.sh" }; 

然後調用exec(commands,String[] envp, File dir)

或 「/ bin/sh的」,而不是 「SH」>如果@Abishek馬諾哈蘭是正確的,你應該放棄-c。

或者,您可以使用ProcessBuilder作爲exmeplified in this answer

+0

我運行以下..但它不工作..'進程p; String [] commands = new String [] {「/ bin/sh」,「-c」,「/home/burhan/bat.sh」}; \t \t \t \t p = Runtime.getRuntime()。exec(commands); ' – BURHANUDDIN

+0

用sh來嘗試變體,並且沒有-c參數等等。 –

+0

是的...我應用你的建議,但它不工作.. – BURHANUDDIN