J'ai créé une application Java qui peut démarrer des processus et capturer leurs PID afin que l'application puisse surveiller le processus. L'utilisateur peut plus tard choisir de tuer l'arborescence de processus entière (session). J'ai fait ceci en utilisant setsid. Un scénario démarre un tas de processus différents via un script Shell en: setsid <Shell script>
. Le PID représente la nouvelle session et la tuer tuera tous les processus générés dans cette session. Cela a très bien fonctionné jusqu'à la sortie d'Ubuntu 12.10. Maintenant, je ne peux pas tuer toutes les sessions démarrées via setsid. Un exemple est Firefox et Google Earth. Gedit peut toujours être tué s'il est démarré via setsid.
J'ai créé un programme de test simple qui exécute kill -SIGTERM -PID
. Le programme de test parvient à tuer Firefox démarré via setsid sous Ubuntu 12.04 mais pas sous Ubuntu 12.10. Je ne sais pas ce qui a changé. J'ai exécuté le programme dans les deux distributions en utilisant OpenJDK 6, 7 et 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)
{
}
}
Dans Ubunutu 12.04 et Centos 5 + 6, il est possible d'utiliser le nom du signal comme SIGTERM mais sur 12.10, il faut utiliser -TERM à la place. Changer mon code pour que les noms de signaux n'aient pas le préfixe 'SIG' semble bien fonctionner en 12.04 et 12.10. Ainsi, l'exemple de code qui fonctionne pour moi est:
Process proc = Runtime.getRuntime().exec("kill -TERM -" + args[0]);
Pour clarifier, kill -SIGTERM -<PID>
Fonctionne dans le Bash Shell dans Ubuntu 12.10 mais pas s'il est exécuté via Runtime.getRuntime.exec()
, il faudrait supprimer la partie 'SIG' comme décrit ci-dessus.