2010-11-10 14 views
8

J'attrapais un signal INT en Java en utilisant le code suivant:Comment piéger un signal dans une application java initialisé à l'aide d'un script bash

Signal.handle(new Signal("INT"), new SignalHandler() { 
     public void handle(Signal sig) { 

      log.warn("Received SIGINT signal. Will teardown."); 

      task.tearDown(); 

      // Force exit anyway 
      System.exit(1); 
     } 
     }); 

Quand je me sers java -jar file.jar pour commencer ma demande je peux attraper le signal envoyé avec avec kill -INT PID.

Si j'appelle java -jar file.jar & (jvm fonctionne en arrière-plan), je ne peux pas attraper le signal envoyé avec kill -INT.

Des idées?

Merci.

+0

Que fait le processus java lorsque vous utilisez kill -INT? Est-ce qu'il se termine ou continue de fonctionner? –

Répondre

3

Fonctionne pour moi. Êtes-vous sûr de tuer le bon pid? Sous Unix, vous pouvez utiliser $! pour obtenir le pid du dernier processus lancé.

$ java -jar file.jar & 
[1] 25573 

$ kill -INT $! 
Received SIGINT signal. Will teardown. 

Mise à jour:

Si vous lancez cette en arrière-plan via un script shell, le système d'exploitation va créer un nouveau groupe de processus qui sera à l'abri des signaux par le clavier tels que SIGINT. Seuls les processus dont l'ID du groupe de processus correspond à l'ID du groupe de processus du terminal en cours peuvent recevoir ces signaux.

essayez donc l'exécuter dans le groupe de processus du terminal actuel comme celui-ci:

. ./script.sh 

Vous serez alors en mesure d'envoyer SIGINT.

Plus d'informations sur le contrôle de travail here.

+0

Ça marche pour moi. Ce qui ne fonctionne pas, c'est attraper le signal dans une application démarrée à partir d'un fichier de script bash. – simao

+0

@simao - la manière dont votre fichier script bash lance le programme java sera importante. Votre programme Java est-il un démon? Comment sont liés les deux processus (le script bash et le programme java)? – justkt

+0

Le programme Java n'est pas un démon et s'exécute en utilisant 2 threads. L'application java est exécutée en utilisant java -jar file.jar et dans un fichier .sh. Merci. – simao

0

Je vais deviner que le script bash ignore SIGINT et que l'enfant hérite du masque de signal.

Regardez dans le script bash pour quelque chose comme ça. (Il peut y avoir plus de nombres que juste 2.)

trap "" 2 

La chaîne vide provoque le shell SIG_IGN. Si à la place vous utilisez:

trap ":" 2 

Cela enregistre un gestionnaire qui ne fait rien. Lorsqu'un processus enfant est démarré, tout signal avec un gestionnaire installé est réinitialisé sur SIG_DFL.

+0

Je l'ai essayé, mais n'a pas résolu mon problème – simao