2009-10-06 27 views
6

Donné ce programme hack.c:bash piège de TERM - qu'est-ce que je fais mal?

#include <stdio.h> 
main() 
{ 
int i=0; 
for(i=0; i<100; i++) { 
    printf("%d\n", i); 
    sleep(5); 
} 
} 

et ce script bash hack.sh:

#!/bin/bash 
./hack 

Si je cours hack.sh, deux processus sont créées - un pour bash, un pour la C tâche. Si un signal TERM est envoyé au processus bash, le processus C est indemne. Maintenant, supposons que le fichier bash d'origine ait été lancé à partir d'un programme Java en utilisant Runtime.exec(), donc le seul contrôle que j'ai par dessus est Process.destroy() (qui envoie TERM au processus bash)? Supposons que je veux le processus C à mourir avec le bash qui l'a lancé?

J'ai essayé des choses comme ça dans bash:

#!/bin/bash 
trap "kill -TERM -$$; exit" TERM 
./hack 

à savoir une clause de piège qui attire le signal TERM et rediffuse à l'ensemble du groupe de processus. Cela ne fonctionne pas pour moi - un processus bash avec cette clause de piège ignore les signaux TERM.

Qu'est-ce qui me manque ici?

+1

La page de manuel de bash indique: Si bash attend une commande pour terminer et reçoit un signal pour lequel un trap a été défini, le trap ne sera pas exécuté jusqu'à ce que la commande soit terminée. – tangens

+0

Avez-vous essayé d'utiliser 'exec' au lieu de garder le processus shell en vie? –

+0

Vous avez raison, tangens. Ma seule excuse est que le texte est dans la section SIGNALS, bien au-dessus de la documentation de piège. Merci! –

Répondre

10

Vous pouvez essayer quelque chose le long de ces lignes:

#!/bin/bash 
./hack & 
pid=$! 
trap "kill $pid" TERM 
wait $pid 

Il est peut-être plus simple (et équivalent) pour ce faire:

#!/bin/bash 
./hack & 
trap "kill $!" TERM 
wait 

Les guillemets doubles sur le piège devrait faire l'expansion de mots se produire quand le piège est défini, donc une valeur changeante de $! ne devrait pas avoir d'impact; mais j'aime mieux la première version.

+0

Cela fonctionne, même si vous pourriez penser que ce n'est pas à cause de ce que dit tangens dans les commentaires sur la question. MAIS le paragraphe complet, qouted partiellement par tangens, dit: – hopla

+0

Si bash attend une commande pour terminer et reçoit un signal pour lequel un trap a été défini, le trap ne sera pas exécuté jusqu'à ce que la commande soit terminée. Lorsque bash attend une commande asynchrone via le waitin intégré, la réception d'un signal pour lequel un trap a été défini provoquera le retour immédiat de l'waitin avec un état de sortie supérieur à 128, immédiatement après lequel le trap est exécuté. – hopla

+0

Vous voulez également ajouter que vous pouvez tuer tout le groupe de processus (le processus lui-même et ses enfants) en faisant: kill -TERM - $$ – hopla