Java: убить все подпроцессы в unix

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

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

Кто-нибудь может помочь?

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


person Florian Müller    schedule 07.04.2012    source источник
comment
Я не уверен, но делайте то, что хотите, в сценарии оболочки, то есть найдите процесс, указав PID, а затем уничтожьте его в самом сценарии оболочки. Вызовите этот скрипт в java.   -  person Ved    schedule 07.04.2012
comment
если ваше приложение имеет определенное имя, то pkill может работать с этим именем.   -  person tartar    schedule 07.04.2012
comment
еще одна заглушка может быть здесь[1] blog.igorminar.com/2007/03/   -  person tartar    schedule 07.04.2012
comment
Приложение не имеет определенного имени, процесс просто называется java. Но если получить идентификатор процесса, как я могу убить все подпроцессы (тогда в сценарии оболочки)?   -  person Florian Müller    schedule 07.04.2012
comment
Где работает хук выключения? Если это на Java, то пробовали ли вы сохранять объекты Process и вызывать для них destroy?   -  person Keith Randall    schedule 07.04.2012
comment
Это кажется очень хорошей идеей... Я не понимал, что ShutdownHook выполняется в том же экземпляре JRE... Это правильно? В этом случае это сработает. Вы можете написать это как ответ, и я отмечу его как правильный :)   -  person Florian Müller    schedule 07.04.2012


Ответы (1)


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

Вот как я получаю идентификатор процесса для своих 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.

person dash1e    schedule 07.04.2012