web-dev-qa-db-fra.com

Comment puis-je supprimer tous les travaux interrompus?

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

Il y a des travaux arrêtés.

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

95
Yazz.com

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

kill -9 `jobs -ps`

jobs -ps répertorie les ID de processus (-p) de l'arrêt (-s) travaux.
kill -9 `jobs -ps` envoie des signaux SIGKILL à chacun d'eux.

78
ooshro

Essayez de taper ceci:

kill -9 $(jobs -p)
84
dukevin

La réponse acceptée tuerait tous les emplois (ce qui est suffisant dans ce cas) et pas seulement ceux arrêtés. Si vous souhaitez tuer uniquement les Stopped, exécutez:

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

Le moyen le plus simple consiste en fait à simplement réessayer immédiatement la sortie; bash signifie que "tuer tous les travaux arrêtés et quitter".

12
geekosaur
for x in `jobs -p` ; do kill -9 $x ; done
7
monu

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

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

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

Explication: le -a l'indicateur indique afficher tous les processus, puis -o contrôle la sortie, quelles informations seront affichées sur 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

donc finalement je le redirige vers grep T$ qui dit, montrez-moi tous les processus qui ont T dans la dernière colonne.

Et puis j'ai une belle liste de tous les processus d'utilisateurs différents 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
5
hwjp

Si vous souhaitez supprimer certains travaux interrompus mais pas tous, essayez ceci:

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 faire la queue que de le mettre au premier plan, il se terminera

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

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

Normalement, si vous recevez ce message, vous devez vous déconnecter deux fois. Par exemple. première Ctrl+D vous donne le message d'avertissement pour vous informer des travaux interrompus, en appuyant une deuxième fois, vous vous déconnecterez en supprimant les travaux. Cela s'applique également aux commandes logout et exit.

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


Si vous ne souhaitez pas supprimer les travaux de votre shell actuel, vous pouvez les supprimer de la table des travaux actifs sans les tuer en utilisant la commande disown. 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 (caractère T), ce qui signifie que le processus a été arrêté par un signal tel que SIGSTOP, SIGTSTP ou autre (comme SIGTTIN ou SIGTTOU).

Dans le cas où jobs une commande intégrée Shell n'est pas disponible, les processus arrêtés peuvent être répertoriés par la commande suivante:

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

Pour les tuer tous, 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
kenorb