Prozesse aus Java beenden


2

Ich habe eine Java-Anwendung erstellt, die Prozesse starten und ihre PIDs erfassen kann, damit die Anwendung den Prozess überwachen kann.Der Benutzer kann später den gesamten Prozessbaum (Sitzung) beenden.Ich habe dies mit setsid getan.Ein Szenario besteht darin, eine ganze Reihe verschiedener Prozesse über ein Shell-Skript zu starten: setsid <shell script>.Die PID stellt die neue Sitzung dar. Wenn Sie sie beenden, werden alle in dieser Sitzung erzeugten Prozesse beendet.Es hat super funktioniert, bis Ubuntu 12.10 veröffentlicht wurde.Jetzt kann ich nicht alle Sitzungen beenden, die über setsid gestartet wurden.Ein Beispiel ist Firefox und Google Earth.Gedit kann immer noch getötet werden, wenn es über setsid gestartet wird.

Ich habe ein einfaches Testprogramm erstellt, das kill -SIGTERM -PID ausführt.Das Testprogramm schafft es, Firefox zu töten, das über setsid unter Ubuntu 12.04 gestartet wurde, jedoch nicht unter Ubuntu 12.10.Ich weiß nicht, was sich geändert hat.Ich habe das Programm in beiden Distributionen mit OpenJDK 6, 7 und Oracle JDK 6 ausgeführt.


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)
        {
        }
}

1

In Ubunutu 12.04 and Centos 5 + 6 it's possible to use the signal name like SIGTERM but on 12.10 one has to use -TERM instead. Changing my code so that the signal names don't have the prefix 'SIG' seem to work well on 12.04 and 12.10. So the example code that works for me is:

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

To clarify, kill -SIGTERM -<PID> works in the Bash shell in Ubuntu 12.10 but not if it's executed through Runtime.getRuntime.exec(), one qould have to remove the 'SIG' part as described above.