2013-03-28 4 views
1

Я пытаюсь выполнить следующую команду из Java (работает должным образом в коробке Unix) -Выполнение команды Unix с Java от обратных кавычек

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

Но при выполнении с помощью Java, я получаю следующее error-

/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); 

п.с. - Напоминаем, что команда отлично работает под оболочкой.

+1

backtick magic выполняется оболочкой, и здесь вы запускаете команду kill без оболочки, поэтому обратные ссылки не оцениваются. – fvu

+0

Вы можете разделить его на части 'ps' и' kill'. –

ответ

5

Что вы пытаетесь запустить, это командная строка оболочки, но вы используете kill и передаете все аргументы, поэтому вы получаете сообщение об ошибке от /usr/bin/kill.

Вы должны запустить оболочку как bash из вашего кода Java, а затем передать свою командную строку с использованием опции -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' –

+0

@kaustavdatta - Не уверен, что происходит. Похоже, что команда терпит неудачу, поскольку 'kill' не может найти этот процесс, но вы говорите, что команда убивается, поэтому я запутался. Альтернативным подходом, который легче было бы отлаживать, было бы просто запустить ps -ef' и использовать Java-код, чтобы найти соответствующий PID из вывода, а затем запустить 'kill', передав его этому PID. –

+0

Нашел ошибку. Добавив ** grep -v grep ** решил проблему –