126 votes

Comment puis-je tuer tous les travaux arrêtés?

Lorsque j'essaie de quitter mon serveur Linux, je reçois le message :

Il y a des tâches arrêtées.

Y a-t-il une seule commande pour les tuer ?

0 votes

Des exemples supplémentaires dans le U&L Q&A : unix.stackexchange.com/questions/124428/…

0 votes

J'ai maintenant le problème opposé, il ne préviendrait pas des tâches arrêtées lorsque je quittais le shell! J'ai dû mettre shopt -s checkjobs dans mon .bashrc

2 votes

Appuyez à nouveau sur ctrl + d, cela vous permettra de quitter maintenant, en tuant ces tâches dans le processus

131voto

ooshro Points 10764

Pour tuer rapidement tous les travaux arrêtés sous le bash, saisissez :

kill -9 `jobs -ps`

jobs -ps liste les identifiants de processus (-p) des travaux arrêtés (-s).
kill -9 `jobs -ps` envoie des signaux SIGKILL à tous ces processus.

23 votes

-1 pour "tuer les emplois"

1 votes

N'a pas fonctionné lorsque le travail était "sudo su". c.-à-d. sudo kill `jobs -p` n'a pas fonctionné mais taper explicitement le PID a fonctionné.

16 votes

Pourquoi cela est-il si fortement voté ? C'est faux. Si les processus sont arrêtés, alors un kill comme celui-ci ne fera rien, car les processus sont arrêtés, ils ne traiteront pas le SIGTERM (-15) qui leur est envoyé par défaut.

90voto

Arun Points 11

Essayez de taper ceci :

kill -9 $(jobs -p)

11 votes

Cela devrait le faire, mais je pense qu'il devrait d'abord envoyer un SIGTERM (-15) avant d'envoyer un SIGKILL (-9). Donc peut-être proposer quelque chose comme "kill $(jobs -p) ; sleep 3s ; kill -9 $(jobs -p)" serait mieux. En envoyant d'abord un SIGTERM, les jobs pourraient sortir proprement (libérer les ressources allouées, etc).

3 votes

Kevin Duke, votre réponse est celle qui a fonctionné pour moi. Je n'ai pas pu voter car je n'ai pas 15 en réputation. kill -9 $(jobs -p)

2 votes

@rems Sauf, comme l'a souligné slm, ils ne recevront pas le SIGTERM car ils sont arrêtés.

17voto

user52636 Points 11

La réponse acceptée tuerait tous les travaux (ce qui est suffisant dans ce cas) et non seulement ceux qui sont arrêtés. Si vous voulez tuer seulement les travaux arrêtés, exécutez :

kill $(jobs -l | grep Stopped | cut -d' ' -f3)

0 votes

Grep/cut peut être combiné dans une seule commande awk: awk '/Stopped/{print $3}')

3 votes

La balise -s dans la réponse acceptée filtre uniquement les éléments stoppés

14voto

geekosaur Points 6915

La manière la plus facile est en fait de simplement réessayer immédiatement la sortie; bash comprendra cela comme "tuer tous les travaux arrêtés et sortir".

4 votes

Cela enverra un HUP qui n'arrête pas nécessairement les travaux.

8voto

monu Points 171
pour x in `jobs -p` ; faire tuer -9 $x ; fait

2 votes

Vous pouvez ajouter une mise en forme du code pour cette ligne pour la rendre plus facile à lire.

0 votes

Pouvez-vous revoir votre mise en forme - utilisez quatre espaces au début de la ligne pour marquer un bloc comme du code (plutôt que d'utiliser un backtick). En ce moment, il n'est pas clair si vous utilisez des backticks dans votre code, ou si vous essayez d'afficher du code en utilisant des backticks.

1 votes

Le formatage est bon. nous devons passer les jobs -p en utilisant des backticks sinon cela ne sera pas considéré comme une commande, et cela lancera une erreur.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X