Linux: Tuer la tâche en arrière-plan


194

Comment puis-je tuer la dernière tâche d'arrière-plan générée sous Linux?

Exemple:

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

18
Comment cela peut-il ne pas être lié à la programmation? La programmation basique n'est pas de la programmation?
flybywire

6
C'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 de cette façon est que si @flybywire le fait dans un script, c'est de la programmation. S'il voulait juste le faire à partir de la ligne de commande, je dirais qu'il appartient à SU.
Bill the Lizard

10
Les scripts shell sont également en programmation.
cletus

Réponses:


234

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

kill $!

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


68
@ polm23; non, ^Zne crée pas d'arrière-plan, il les arrête. Un suivant bgfait le «backgrounding» réel (reprend l'exécution en arrière-plan), et après cela $!fonctionne comme prévu.
falstro

En supposant que les ????stands représentent une ou plusieurs commandes à exécuter après la mise à mort, si l'une de ces commandes repose sur le travail effectué par le processus d'arrière-plan, soyez attentif à toutes les tâches de nettoyage ou de finition que le processus d'arrière-plan pourrait effectuer dans un gestionnaire de signaux après recevoir un signal (captable). Il est préférable d'ajouter un wait(suivi peut-être d'un syncou même d'un sleep <n>) juste avant la première de ces commandes «dépendantes».
ack

2
Pour l'achèvement: comme un seul% fait également référence au travail en cours, vous pouvez tuer le travail arrêté (^ z) avec "tuer%". Je l'utilise presque toujours après ^ z.
t3o

Cela ne fonctionne que si vous avez activé le contrôle des tâches, qui n'est activé que par défaut dans les shells interactifs (bien que puisque vous faites référence à l'utilisation de ctrl-z, je suppose que vous faites également référence à l'utilisation d'un shell interactif) - mais cela a été décrit dans d'autres réponses ici,
je

289

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

C'est [1]le numéro de la tâche et peut être référencé comme:

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

Pour voir une liste des numéros de tâche, utilisez la jobscommande. Plus de man bash:

Il existe plusieurs façons de faire référence à un travail dans le shell. Le personnage %introduit un nom de travail. Le numéro de poste npeut être appelé %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, %cefait référence à un cetravail arrêté . Si un préfixe correspond à plusieurs travaux, bash signale une erreur. L'utilisation %?ce, d'autre part, fait référence à tout travail contenant la chaîne cedans sa ligne de commande. Si la sous-chaîne correspond à plusieurs travaux, bash signale une erreur. Les symboles %%et%+se référer à la notion du 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é à l'aide de %-. Dans la sortie relative aux travaux (par exemple, la sortie de la commande jobs), le travail en cours est toujours signalé par un +et le travail précédent par un -. Un seul %(sans spécification de tâche associée) fait également référence à la tâche actuelle.


Pour mémoire, je pense que cela ne fonctionne que si le contrôle des travaux est activé. Bien que je pense que vous pouvez l'activer dans des scripts ( set -m), il est destiné à une utilisation interactive. Voir stackoverflow.com/questions/690266/... aussi bien
falstro

9
Symboles très utiles, ceux %1- ci et %%- surtout. Certaines choses ne meurent pas en Ctrl-C, vous devez donc les Ctrl-Z, puis kill -9 %%. Un exemple où je l'ai trouvé utile est: while true; do mplayer <some unstable online radio>; date >> restarts.log; done- Ctrl-C vous amènera simplement à la prochaine itération de la boucle. Avant je devais faire psou peut jobs -l- être , puis retaper le PID, ce qui est fastidieux.
Tomasz Gandor

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

3
@TomaszGandor C'est pourquoi vous voudrez peut-être le remplacer while truepar while sleep 1. Cela vous donnera un court délai avant de redémarrer si vous pouvez vivre avec cela, et si vous appuyez deux fois sur ctrl-c, le second interrompra le sommeil, le terminant par une sortie non nulle et sortant de la boucle.
falstro

45

La commande suivante vous donne une 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

25

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

jobs -p | xargs kill -9

1
C'est ce que j'utilisais auparavant, mais kill -9 %%c'est moins en tapant :)
Tomasz Gandor

4
@TomaszGandor Cela ne tuera 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 supprimera TOUS les travaux.
bitek


2
skill doB

skill est une version de la commande kill qui vous permet de sélectionner un ou plusieurs processus en fonction d'un critère donné.


0

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


0

c'est une réponse hors sujet, mais, pour ceux qui sont intéressés, elle peut être utile.

Comme dans la réponse de @John Kugelman,% est lié à la spécification du poste. comment trouver cela efficacement? utilisez moins la commande & pattern , l'homme semble utiliser moins de téléavertisseur (pas si sûr), dans man bash tapez &% puis tapez Enter n'affichera que les lignes contenant '%', pour tout afficher, tapez &. puis entrez.


-3

Utilisez simplement la commande killall:

nom de tâche killall

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 en fait un accès facile au PID. Et dangereux aussi, surtout si vous êtes root
Dave Vogt

3
Pas très utile, si vous deviez killall pythonou killall java, tout en ayant quelque chose d'utile en cours d'exécution ailleurs dans le système.
Tomasz Gandor
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.