2012-04-07 2 views
1

Я получил приложение, написанное в java, которое работает в Unix и запускает два подпроцесса (через Runtime.getRuntime().exec()) при запуске. Если приложение по какой-то причине врезалось, подпроцессы не будут убиты.Java: Убить все подпроцессы на unix

Теперь я добавил крюк выключения, который срабатывает при каждом сбое, хорошо до сих пор. Но я хотел бы отправить сигнал SIGTERM (или, по крайней мере, SIGINT) на консоли UNIX для каждого подпроцесса приложения. Я должен был бы найти их идентификаторы процессов через ps, но я не смог правильно его извлечь и отправить сигнал для каждого процесса.

Может ли кто-нибудь помочь?

Большое спасибо!

+0

Я не уверен, но выполняю то, что вы хотите в сценарии оболочки. Я найду процесс, поставив PID, а затем уничтожьте его в самом скрипте оболочки. Вызовите этот скрипт в java. – Ved

+0

Если ваше приложение имеет определенное имя, то pkill может работать с этим именем. – tartar

+0

еще один заглушка может быть здесь [1] http://blog.igorminar.com/2007/03/one-more-way-how-to-get-current-pid-in.html – tartar

ответ

2

Что я предлагаю, это не официальная функция, а трюки.

Вот как я получаю идентификатор процесса для своих приложений Java. Я не нашел другого пути.

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; 
} 

Это работает на win, mac и linux.