2010-12-01 5 views
3

Je suis dans un comportement étrange pour une application que j'utilise. Si je commence la commande en arrière-plan bash, je peux le tuer en utilisantTuer un processus dans un script

$ command & 
$ kill -n 2 [PID of command] 
    killing command gracefully 

Cependant, quand je jette ce dans un script:

command & 
ID=$! 
kill -n 2 $ID 

il ne fait rien du tout. Y at-il un peu subtilement que je manque?

Edit: Une autre idée est qu'une fois que le script cesse de fonctionner, je ne peux pas tuer la commande kill -n 2.

+0

'ID = commande &' ne fait pas ce que vous pensez. – nmichaels

+0

Désolé, je suis paresseux avec l'abréviation de mon code. Édité. – victor

+0

pourquoi ne pas utiliser kill -9 $ PID – chemila

Répondre

0

Si vous commande des sorties au terminal, bash s'arrête avec SIGSTOP, qui sera faites-en ignorer SIGINT que vous envoyez.

+0

Lorsque j'écho $ ID, il imprime le PID correct. – victor

0

Votre ID $ correspond à une chaîne de commande, alors que ce dont vous avez besoin est un PID. Peut-être essayer ceci:

ID=`pidof -s command` 
kill -9 $ID 
+0

Lorsque j'écho $ ID, il imprime le PID correct. – victor

0

Ce n'est probablement pas votre problème, mais le -n est une option pour la commande de destruction intégrée de bash. Je suggère d'utiliser -NAME à la place pour que cela fonctionne aussi pour la commande.

0

Certains shells prenant en charge le contrôle des travaux en mode interactif n'autorisent pas le contrôle des travaux dans les scripts par défaut. set -m activera le contrôle du travail.

0

Ajoutez une commande wait juste après votre kill.

0

Il semble que dans le cas où la commande est exécutée à partir d'un script, il va gérer/ignorer certains signaux. Néanmoins, vous pouvez toujours tuer le processus avec SIGKILL (1) comme ceci:

kill -n 1 $ID 
1

homme 7 Signal Vous envoyez un signal 2, INT, à votre processus, qui est Interrompre à partir du clavier, pourquoi? Les gens disent d'envoyer un signal 1, pourquoi?

Le moyen standard pour tuer un processus est le signal 15, sigal de terminaison, qui est la valeur par défaut utilisée par kill.

Alors utilisez simplement tuer « PID $ »

Ensuite, dans le cas où votre course subprocess de processus, vous ne veulent pas seulement tuer le père, mais vous voulez les tuer tous, alors utilisez « - PID $ "au lieu de" $ PID "pour tuer tout le groupe de processus, mais comme kill pensera que -" $ PID "est un numéro de signal, il se plaindra, donc vous devrez être plus précis, comme:

kill -15 -"$PID" 

Si le programme ne veut pas mourir, utilisez kill -9 - "PID $"

man 7 signal 
man kill