2015-10-09 2 views
1

Я использую команду Runtime.getRuntime().exec для выполнения команды tail -f filename | grep str, которая основана на трубе OS. Мне удалось достичь своей бизнес-логики. Но все-таки есть проблема, которую я должен решить: При использовании трубы, процесс для другого процесса для команды хвоста:Как уничтожить подпроцесс Java-процесса

$ ps -ef | grep test.log 
admin  6953 32721 0 16:32 ?  00:00:00 /bin/sh -c tail -f /home/admin  
/test.log | unbuffer -p grep '1444379575648' 
admin  6957 6953 0 16:32 ?  00:00:00 tail -f /home/admin/test.log 

Process.destroy() метод уничтожает себя (PID: 6953) only.How я могу уничтожить его subprocess(pid:6957) в моей программе Java?

ответ

0

Не используйте Runtime.getRuntime().exec(...), используйте 2 ProcessBuilder s для явного создания отдельных процессов и соедините их входы и выходы вместе, чтобы сделать эквивалент трубопровода.

Тогда вы будете иметь отдельный объект Process для каждого и можете убить их, как вам будет угодно.

+0

Это хорошее предложение, но может ли оно отрицательно повлиять на производительность процесса? –

+0

Производительность должна учитываться только после функциональности: если вам нужен PID процесса, и вы не можете его получить, ваша производительность бесконечно плоха в том, что она не делает правильные вещи. –

+0

Вы имеете в виду, что нет способа получить pid процесса? –

0

я нашел еще один способ:

public static final String getPid() { 
    try { 
     RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean(); 
     String name = runtimeBean.getName(); 
     int k = name.indexOf('@'); 
     if (k > 0) 
      return name.substring(0, k); 
    } catch (Exception ex) { 
    } 
    return null; 
} 

Это работает на Linux, Win, Mac.

+0

Извините, какой процесс 'PID должен возвращаться? –

+0

После получения pid подпроцесса, как я могу уничтожить процесс? –

+0

Вам нужно будет сделать что-то конкретное для платформы, например, выполнить команду 'kill' в linux,' killtask' на окнах и т. Д. Тем более разумно использовать 'ProcessBuilder/Process', так как это абстрагирует специфические для платформы детали для вы. –