2012-03-23 8 views
2
tail -f test.log 

Выше команда закроет журнал, который запускает процесс за кулисами. Как я могу убить этот конкретный процесс?Убить Linux-процесс просто запустил

Я могу нажать «Ctrl-Z» на оболочке, но я запускаю эту команду с помощью Java и должен убить этот процесс.

Любая помощь по этому поводу будет высоко оценена.

благодаря

ответ

3

Когда вы start a subprocess with Java вы получите обратно a Process object соответствующий запущенному процессу , Вы можете использовать destroy() method on the Process object, чтобы убить запущенную команду.

Таким образом, вы бы начать его с:

Process p = Runtime.getRuntime().exec(new String[] {"tail","-f","test.log"}); 

и убить его:

p.destroy(); 

Если вы просто читаете новые строки добавляются в файл, вы рассмотрели делать это изначально в Ява? Чтение файла довольно прост:

try { 
    BufferedReader input = new BufferedReader(new FileReader("tail.log")); 

    while (true) { 
    String line; 

    while ((line = input.readLine()) != null) { 
     //You'll probably want to do something other than println() 
     System.out.println(line); 
    } 

    try { 
     Thread.sleep(500); 
    } catch (InterruptedException e) { 
     break; 
    } 

    } 

    input.close(); 
} 
catch (IOException ioe) { 
    //Handle this 
} 

Вы, вероятно, хотите, чтобы запустить это в другом Thread. И в отличие от tail -f приведенный выше код не обрабатывает файл, который переписывается с самого начала, а не прилагается к нему, но вы можете это исправить.

0

Ну, вы можете сделать

ps -ef | grep java 

найти все процессы Java, а затем просто убить тот, который вы хотите.

1

Вы можете попробовать killall tail, но это убьет все запущенные хвостовые процессы.

Лучше всего использовать возвращаемый Process: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html

После того как вы

Process child = Runtime.getRuntime().exec("tail -f test.log"); 

вы можете

child.destroy() 
Смежные вопросы