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


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

Il y a des emplois arrêtés.

: Existe-t-il une seule commande pour les tuer?


80
2018-02-25 10:07


origine


Exemples supplémentaires dans le Q & A de U & L: unix.stackexchange.com/questions/124428/… - slm
J'ai eu le problème opposé maintenant, il ne serait pas avertir des emplois arrêtés lorsque je quitte le shell! Dû mettre shopt -s checkjobs dans mon .bashrc - Sam Watkins
appuyez à nouveau sur ctrl + d, il vous permettra de sortir maintenant, éliminant ainsi ces emplois - Jens Timmerman


Réponses:


Pour supprimer rapidement tous les travaux exécutés sous la bash, entrez:

kill `jobs -ps`

jobs -ps liste des processus ID des travaux arrêtés. kill `jobs -ps` envoyer le signal TERM à toutes les tâches arrêtées.


69
2018-02-25 10:15



-1 pour "tuer les emplois" - Tibor
n'a pas fonctionné lorsque le travail était "sudo su". c'est à dire. sudo kill `jobs -p` n'a pas fonctionné mais taper explicitement PID l'a fait. - user13107
Pourquoi est-ce si haut voté? C'est faux. Si les processus sont arrêtés, alors un kill comme cela ne fera rien, puisque les processus sont arrêtés, ils ne traiteront pas le SIGTERM (-15) qui leur est envoyé par défaut. - slm
kill -9 fera l'affaire. - Blossoming_Flower
Clairement mauvaise réponse! - mrangry777


Essayez de taper ceci:

kill -9 $(jobs -p)

76
2018-02-25 10:14



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 que proposer quelque chose comme "tuer $ (emplois -p); dormir 3s; tuer -9 $ (emplois -p)" serait mieux. En envoyant d'abord SIGTERM, les travaux peuvent être en mesure d'effectuer une sortie propre (libération des ressources allouées, etc.). - rems
Kevin Duke, votre réponse est celle qui a fonctionné pour moi. Je n'ai pas pu voter parce que je n'ai pas 15 ans de réputation. kill -9 $ (jobs -p)
@rems Sauf, comme l'a souligné slm, ils ne recevront pas le SIGTERM car ils sont arrêtés. - Paul Gear
Ne fonctionne pas sur zsh. En raison de zsh n'étant pas POS  IX conforme aux emplois. - Max Coplan


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

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

16
2018-03-08 18:04



grep / cut peut être combiné en une commande awk: awk '/Stopped/{print $3}') - laebshade
la -s argument sur les réponses acceptées ne filtre que les arrêtés - 79E09796


Le moyen le plus simple est en réalité de simplement réessayer immédiatement la sortie; bash cela signifiera "tuer tous les travaux arrêtés et quitter".


12
2018-03-08 18:13



Cela enverra un HUP qui n'arrêtera pas nécessairement les travaux. - Stephen Niedzielski


for x in `jobs -p` ; do kill -9 $x ; done

7
2018-02-26 10:22



vous pouvez ajouter une mise en forme de code pour cette ligne afin de la rendre plus lisible. - drcelus
Pouvez-vous revoir votre formatage - utilisez quatre espaces au début de la ligne pour marquer un bloc en tant que code (plutôt que d'utiliser backtick). À l'heure actuelle, il n'est pas clair si vous utilisez des backticks dans votre code ou essayez d'afficher le code à l'aide de backticks. - dunxd
Le formatage est bon. nous devons passer les travaux -p en utilisant des backticks, sinon cela ne sera pas considéré comme une commande, et une erreur sera renvoyée. - monu


Si vous souhaitez supprimer certains travaux arrêtés mais pas tous, essayez ceci:

Tout d’abord, listez les emplois, vous obtiendrez quelque chose comme ceci:

$ jobs -l

[2]   4813 Stopped                 ./parse < call.txt
[3]-  4819 Stopped                 ./parse < call.txt

envoyer kill à un travail arrêté, il ne fera que mettre en file d'attente que mettre au premier plan, il se terminera

$ fg %2
./parse < call.txt
Terminated

$ jobs -l
[3]-  4819 Stopped                 ./parse < call.txt

4
2018-05-30 04:16





Normalement, si vous recevez ce message, vous devez vous déconnecter deux fois. Par exemple. premier Ctrl + D vous donne le message d’avertissement vous informant des tâches arrêtées; une deuxième pression sur cette touche vous permettra de vous déconnecter, éliminant ainsi les tâches. C'est la même chose pour logout et exit commandes.

Pour les tuer manuellement, essayez: kill $(jobs -p).


Si vous ne voulez pas supprimer les tâches de votre shell actuel, vous pouvez les supprimer du tableau des tâches actives sans tuer en utilisant disown commander. Par exemple.

$ sleep 1000 &
[1] 19404
$ jobs
[1]+  Running                 sleep 1000 &
$ disown

Les travaux arrêtés peuvent également être déterminés par l’état du processus (T caractère), ce qui signifie que le processus a été arrêté par un signal tel que SIGSTOP, SIGTSTP ou autre (comme SIGTTIN, ou SIGTTOU).

Au cas où jobs une commande intégrée du shell n'est pas disponible, les processus arrêtés peuvent être répertoriés à l'aide de la commande suivante:

ps wuax | awk '$8 ~ "T"'

Pour tous les tuer, vous pouvez essentiellement taper:

kill -9 $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')

Voici un test simple:

$ sleep 1000 &
[1] 2014
$ sleep 1000 &
[2] 2015
$ sleep 1000 &
[3] 2016
$ sleep 1000 &
[4] 2017
$ killall -STOP sleep
[1]   Stopped                 sleep 1000
[2]   Stopped                 sleep 1000
[3]   Stopped                 sleep 1000
[4]   Stopped                 sleep 1000
$ ps wuax | awk '$8 ~ "T"'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
vagrant   2014  0.0  0.0   7228   832 pts/0    T    20:38   0:00 sleep 1000
vagrant   2015  0.0  0.0   7228   708 pts/0    T    20:38   0:00 sleep 1000
vagrant   2016  0.0  0.0   7228   760 pts/0    T    20:38   0:00 sleep 1000
vagrant   2017  0.0  0.0   7228   828 pts/0    T    20:38   0:00 sleep 1000
$ kill -9 $(awk 'NR>1 && $8 ~ "T" {print $2}' <(ps wuax))
$ jobs
[1]   Killed                  sleep 1000
[2]   Killed                  sleep 1000
[3]   Killed                  sleep 1000
[4]   Killed                  sleep 1000

4
2018-02-19 20:46





Juste au cas où cela aiderait quelqu'un d'autre - la plupart des gens sont ici parce qu'ils ont démarré des processus arrêtés qu'ils ont peut-être déjà lancés via le shell. J'avais besoin de trouver des processus, en tant que root, arrêtés par d'autres utilisateurs, pour lesquels des variantes du jobs la commande ne fera pas.

Un peu de creuser avec man ps m'a amené à ceci:

ps -a -o pid,user,cmd,state | grep 'T$'

Explication: le -a drapeau dit montrer tous les processus, puis -o contrôle la sortie, quelles informations seront affichées à propos de chaque processus. Je choisis pid, user, cmd (la ligne de commande), et state, qui est le état du processus.

De man ps:

PROCESS STATE CODES
   Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the
   state of a process:
           D    uninterruptible sleep (usually IO)
           R    running or runnable (on run queue)
           S    interruptible sleep (waiting for an event to complete)
           T    stopped, either by a job control signal or because it is being traced
           W    paging (not valid since the 2.6.xx kernel)
           X    dead (should never be seen)
           Z    defunct ("zombie") process, terminated but not reaped by its parent

alors finalement je le tuyau à grep T$ qui dit, montre-moi tous les processus qui ont T dans la dernière colonne.

Et puis j'ai une belle liste de tous les processus de différents utilisateurs qui sont à l'état arrêté.

$ ps -a -o pid,user,cmd,state | grep 'T$'
  865 joson74+ python                      T
  885 joson74+ sh -c less                  T
  886 joson74+ less                        T
 1014 minames+ python3.4 -i /home/minames  T
 5352 MooKo    nano stdio.h                T
 7851 harry    tmux attach                 T
12083 harry    tmux attach                 T
13495 gorylla+ python3.4 -i /home/gorylla1 T
18009 conr1d   vim                         T
19664 enythin+ python                      T
24906 wardlist python                      T

4
2018-02-26 06:47



Pour que les tâches arrêtées soient attachées au shell actuel, jobs -ps est plus simple que cette réponse. Cela étant dit, cette réponse ne montre pas que les emplois arrêtés via Ctrl-Z dans une coquille, mais tous les travaux arrêtés: autres shells, autres utilisateurs, y compris les travaux en cours de débogage (par exemple, par gdb). - Stéphane Gourichon