Processos de matança de Java

2

Eu criei um aplicativo Java que pode iniciar processos e capturar seus PIDs para que o aplicativo possa monitorar o processo. O usuário pode, posteriormente, escolher matar toda a árvore de processos (sessão). Eu fiz isso utilizando o setsid. Um cenário é iniciar um monte de processos diferentes por meio de um script de shell: setsid <shell script> . O PID representa a nova sessão e matá-lo irá matar todos os processos gerados nessa sessão. Funcionou muito bem até que o Ubuntu 12.10 foi lançado. Agora eu não posso matar todas as sessões iniciadas via setsid. Um exemplo é o Firefox e o Google Earth. O Gedit ainda pode ser eliminado se iniciado através do setsid.

Eu criei um programa de teste simples que executa kill -SIGTERM -PID . O programa de teste consegue matar o firefox iniciado via setsid no Ubuntu 12.04 mas não no Ubuntu 12.10. Eu não sei o que mudou. Eu executei o programa em ambas as distribuições usando o OpenJDK 6, 7 e o Oracle JDK 6.


public class kill
{
        public static void main(String[] args)
        {
    try 
        {
        System.out.println("kill -SIGTERM -" + args[0]);
        Process proc = Runtime.getRuntime().exec("kill -SIGTERM -" + args[0]);
        int exitVal = proc.waitFor();
        System.out.println("Exit value: " + exitVal); // often 1 under Ubuntu 12.10
        }
    catch (Exception e)
        {
        }
}

    
por Steve 27.11.2012 / 16:07

1 resposta

1

No Ubunutu 12.04 e no Centos 5 + 6 é possível usar o nome do sinal como SIGTERM, mas no 12.10 é necessário usar o -TERM. Alterar meu código para que os nomes dos sinais não tenham o prefixo 'SIG' parece funcionar bem em 12.04 e 12.10. Então, o código de exemplo que funciona para mim é:

Process proc = Runtime.getRuntime().exec("kill -TERM -" + args[0]);

Para esclarecer, kill -SIGTERM -<PID> funciona no shell Bash no Ubuntu 12.10, mas não se for executado através de Runtime.getRuntime.exec() , um deve remover a parte 'SIG' conforme descrito acima.

    
por Steve 22.03.2013 / 09:47