2009-10-26 23 views
153

Comment est-ce que je peux tuer la dernière tâche d'arrière-plan engendrée dans linux?linux: kill tâche d'arrière-plan

Exemple:

doSomething 
doAnotherThing 
doB & 
doC 
doD 
#kill doB 
???? 
+16

Comment cela ne peut-il pas être lié à la programmation? La programmation Bash ne programmation pas? – flybywire

+3

Appartient sur le super-utilisateur à mon humble avis. – Hasturkun

+5

Ceci est dans la région de chevauchement entre SO et SU, mais je pense que cela correspond mieux ici sur SO. Mon critère pour penser ainsi est que si @flybywire le fait dans un script, c'est la programmation. S'il voulait juste le faire depuis la ligne de commande, je dirais qu'il appartient à SU. –

Répondre

184

Il y a une variable spéciale pour cela dans bash:

kill $! 

$! se développe au PID du dernier processus exécuté en arrière-plan.

+16

Cela ne fonctionne pas pour les travaux en arrière-plan avec '^ Z'. – polm23

+56

@ polm23; non, '^ Z' n'a pas d'arrière-plan, il les arrête. Un 'bg' suivant fait le 'backgrounding' réel (reprend l'exécution en arrière-plan), et après que' $! 'Fonctionne comme prévu. – falstro

+0

En supposant que '????' représente une ou plusieurs commandes à exécuter après la destruction, si l'une de ces commandes repose sur le travail effectué par le processus d'arrière-plan, soyez attentif aux tâches de nettoyage ou de finition que le processus en arrière-plan peut fonctionner dans un gestionnaire de signaux après avoir reçu un signal (captable). Il est préférable d'ajouter un 'wait' (suivi peut-être par un' sync' ou même un 'sleep ') juste avant la première de ces commandes 'dépendantes'. – ack

1

Vous avez besoin de son pid ... utiliser "ps -A" pour le trouver.

-1

Il suffit d'utiliser la commande killall:

killall nom_tâche

pour plus d'informations et des options plus avancées, tapez "man killall".

+4

Je pense que killall est un peu agressif quand vous avez un accès facile au PID. Et dangereux, aussi, surtout si vous êtes root –

+2

Pas très utile, si vous deviez "killall python" ou "killall java", tout en ayant quelque chose d'utile en cours d'exécution ailleurs dans le système. –

2
skill doB 

skill est une version de la commande kill qui vous permet de sélectionner un ou plusieurs processus basés sur un critère donné.

247

Vous pouvez tuer par numéro de travail. Lorsque vous mettez une tâche en arrière-plan, vous verrez quelque chose comme:

$ ./script & 
[1] 35341 

Ce [1] est le nombre d'emplois et peut être référencé comme:

$ kill %1 
$ kill %% # Most recent background job 

Pour voir une liste de numéros d'emploi utilisent la jobs commande. Plus de man bash:

Il existe plusieurs façons de faire référence à un travail dans le shell. Le caractère % introduit un nom de travail. Le numéro de travail n peut être référencé %n. Un travail peut également être référencé en utilisant un préfixe du nom utilisé pour le démarrer ou en utilisant une sous-chaîne qui apparaît dans sa ligne de commande. Par exemple, %ce fait référence à un travail ce arrêté. Si un préfixe correspond à plusieurs tâches, bash signale une erreur. En revanche, l'utilisation de %?ce fait référence à tout travail contenant la chaîne ce dans sa ligne de commande. Si la sous-chaîne correspond à plusieurs travaux, bash signale une erreur. Les symboles %% et %+ font référence à la notion de shell du travail en cours, qui est le dernier travail arrêté alors qu'il était au premier plan ou démarré en arrière-plan. Le travail précédent peut être référencé en utilisant %-. Dans la sortie relative aux travaux (par exemple, la sortie de la commande jobs), le travail en cours est toujours marqué avec un + et le travail précédent avec un -. Un seul % (sans cahier des charges d'accompagnement) fait également référence au travail en cours .

+0

Pour mémoire, je pense que cela ne fonctionne que si le contrôle de travail est activé. Bien que je pense que vous pouvez l'activer dans les scripts ('set -m'), il est destiné à un usage interactif. Voir http://stackoverflow.com/questions/690266/why-cant-i-use-job-control-in-a-bash-script ainsi – falstro

+6

Symboles très utiles, ces '% 1' et' %% '- notamment. Certaines choses ne meurent pas sur Ctrl-C, vous devez donc les Ctrl-Z, puis "kill -9 %%". Un exemple où je l'ai trouvé utile est: 'true; do mplayer ; date >> restarts.log; done' - Ctrl-C vous amènera juste à l'itération de la boucle suivante. Avant je devais faire 'ps' ou peut-être' jobs -l', puis retaper le PID, ce qui est fastidieux. –

+0

Y en a-t-il un pour tous les emplois? – CMCDragonkai

40

La commande suivante vous donne la liste de tous les processus d'arrière-plan de votre session, ainsi que le pid. Vous pouvez ensuite l'utiliser pour tuer le processus.

jobs -l 

Exemple d'utilisation:

$ sleep 300 & 
$ jobs -l 
[1]+ 31139 Running     sleep 300 & 
$ kill 31139 
20

Cela devrait tuer tous les processus d'arrière-plan:

jobs -p | xargs kill -9 
+1

C'est ce que j'utiliserais auparavant, mais 'kill -9 %%' est moins tapant :) –

+4

@TomaszGandor Cela ne tue que le travail en cours, c'est-à-dire le dernier travail arrêté au premier plan ou démarré en arrière-plan. La commande dans la réponse va tuer tous les emplois. – bitek

+3

[ne pas tuer -9] (http://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process) – lesmana

0

c'est un de réponse sujet, mais, pour ceux qui sont intéressés, il peut être utile .

Comme dans la réponse de John Kugelman,% est lié à la spécification du travail. comment trouver efficacement cela? utiliser la commande de motif & de less, semble que l'homme utilise moins pager (pas si sûr), dans l'homme bash tapez &% alors tapez Entrer montrera seulement les lignes qui contiennent '%', pour tout afficher, tapez &. puis entrez.