2013-03-28 75 views
1

我試圖從Java執行以下命令,執行一個Unix命令(在UNIX系統中運行正常) -與反引號從Java

kill -9 `ps -ef | grep -i myScript.sh | grep bash | awk '{print $2}'` 

但通過Java執行時,我獲得以下錯誤 -

/usr/bin/kill[8]: `ps: Arguments must be %job or process ids 
Exit : 1 

代碼:

String command = "kill -9 `ps -ef | grep -i myScript.sh | grep bash | awk '{print $2}'`"; 
Process process=Runtime.getRuntime().exec(command); 
InputStream stderr = process.getErrorStream(); 
InputStreamReader inputStream = new InputStreamReader(stderr); 
BufferedReader reader = new BufferedReader(inputStream); 
String error = null; 
while((error = reader.readLine()) != null) { 
    System.out.println(error); 
} 
exitVal = process.waitFor(); 
System.out.println("Exit : "+ exitVal); 

PS - 只是提醒一下,該命令在shell下運行得非常好。

+1

backtick magic是由shell完成的,在這裏你運行命令kill without shell,這就是爲什麼反引號沒有被評估的原因。 – fvu 2013-03-28 08:49:08

+0

你可以將它分成'ps'和'kill'部分。 – 2013-03-28 08:49:59

回答

5

你試圖運行的是一個shell命令行,但是你運行的是kill並且傳遞了所有參數,這就是爲什麼你從/usr/bin/kill得到錯誤的原因。

您應該從Java代碼運行一個類似bash的shell,然後使用-c選項傳遞命令行。

如果你這樣做,將命令參數作爲數組傳遞給你可能是一個好主意,而不是單一的刺激。

String[] command = {"bash","-c","kill -9 `ps -ef | grep -i myScript.sh | grep bash | awk '{print $2}'`"}; 
+0

Dave ..我已經將我的命令args作爲一個數組傳遞,現在,即使進程在後端死亡,我從Java方法中得到了這個錯誤 - '/ bin/bash:line 0:kill :(13507) - 沒有這樣的過程 Exit2:9' – 2013-03-28 09:41:25

+0

@kaustavdatta - 不知道發生了什麼事。聽起來像命令失敗,因爲'kill'找不到進程,但你說命令正在被殺死,所以我很困惑。另一種更容易調試的方法是隻運行'ps -ef'並使用Java代碼從輸出中找到合適的PID,然後運行'kill'將PID傳遞給它。 – 2013-03-28 10:36:35

+0

找到了bug ..添加** grep -v grep **解決了問題 – 2013-03-28 11:09:25