Pregunta ¿Cómo puedo matar a todos los trabajos detenidos?


Cuando intento salir de mi servidor Linux, recibo el mensaje:

Hay trabajos parados.

: ¿Hay un solo comando para matar a estos?


80
2018-02-25 10:07


origen


Ejemplos adicionales en las preguntas y respuestas de U&L: unix.stackexchange.com/questions/124428/… - slm
Ahora tenía un problema opuesto, ¡no avisaría sobre los trabajos detenidos cuando saliera de la shell! Tuvo que poner shopt -s checkjobs en mi .bashrc - Sam Watkins
presiona ctrl + d otra vez, te permitirá salir ahora, eliminando esos trabajos en el proceso - Jens Timmerman


Respuestas:


Para eliminar rápidamente todos los trabajos que se ejecutan bajo el bash, ingrese:

kill `jobs -ps`

jobs -ps Indique el ID de proceso de los trabajos detenidos. kill `jobs -ps` enviar la señal TERM a todos los trabajos detenidos.


69
2018-02-25 10:15



-1 para "matar trabajos" - Tibor
no funcionó cuando el trabajo era "sudo su". es decir sudo kill `jobs -p` No funcionó pero explícitamente escribiendo PID lo hizo. - user13107
¿Por qué es esta upvot tan alta? Está incorrecto. Si los procesos se detienen, entonces un kill como esto no hará nada, ya que los procesos se detienen, no procesarán el SIGTERM (-15) que se les envía de forma predeterminada. - slm
kill -9 hará el truco. - Blossoming_Flower
¡Claramente la respuesta equivocada! - mrangry777


Intenta escribir esto:

kill -9 $(jobs -p)

76
2018-02-25 10:14



Eso debería hacerlo, pero creo que debería enviar primero un SIGTERM (-15) antes de enviar un SIGKILL (-9). Así que quizás proponer algo como "kill $ (jobs -p); sleep 3s; kill -9 $ (jobs -p)" sería mejor. Al enviar SIGTERM primero, los trabajos pueden hacer una salida limpia (liberando recursos asignados, etc.). - rems
Kevin Duke, tu respuesta es la que funcionó para mí. No pude votar porque no tengo 15 en reputación. kill -9 $ (trabajos -p)
@rems Excepto, como señaló slm, no obtendrán el SIGTERM porque están detenidos. - Paul Gear
No funciona en zsh. Debido a zsh no es POS  IX compatible con trabajos. - Max Coplan


La respuesta aceptada mataría a todos los trabajos (lo cual es suficiente en este caso) y no simplemente a los detenidos. Si quieres matar solo a los Detenidos, corre:

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

16
2018-03-08 18:04



grep / cut se puede combinar en un comando awk: awk '/Stopped/{print $3}') - laebshade
la -s argumento sobre los filtros de respuesta aceptados sólo los detenidos - 79E09796


La forma más fácil es en realidad simplemente reintentar inmediatamente la salida; bash Tomará eso como "matar todos los trabajos detenidos y salir".


12
2018-03-08 18:13



Eso enviará un HUP que no necesariamente detiene los trabajos. - Stephen Niedzielski


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

7
2018-02-26 10:22



puede agregar formato de código para esta línea para que sea más fácil de leer. - drcelus
¿Puedes volver a ver tu formato? Usa cuatro espacios al comienzo de la línea para marcar un bloque como código (en lugar de usar la marca de retroceso). En este momento, no está claro si está utilizando backticks en su código, o tratando de mostrar código usando backticks. - dunxd
El formato está bien. tenemos que pasar los trabajos -p usando backticks, de lo contrario no se considerará un comando, y generará un error. - monu


Si desea eliminar algunos trabajos detenidos pero no todos, intente esto:

Primero, lista de trabajos, obtendrás algo como esto:

$ jobs -l

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

mata a un trabajo detenido, no hará más que hacer cola que traerlo en primer plano, terminará

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

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

4
2018-05-30 04:16





Normalmente, si recibió ese mensaje, debe cerrar la sesión dos veces. P.ej. primero Ctrl + D le da el mensaje de advertencia para informarle sobre los trabajos detenidos, al presionar por segunda vez, se cerrará la sesión y se eliminarán los trabajos. Esto mismo se aplica a logout y exit comandos

Para matarlos manualmente, intente: kill $(jobs -p).


Si no desea eliminar trabajos de su shell actual, puede eliminarlos de la tabla de trabajos activos sin matar usando disown mando. P.ej.

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

Los trabajos detenidos también pueden ser determinados por el estado del proceso (T carácter) lo que significa que el proceso se detuvo por una señal como SIGSTOP, SIGTSTP u otro (como SIGTTINo SIGTTOU).

En caso de que jobs un comando incorporado de shell no está disponible, los procesos detenidos pueden enumerarse mediante el siguiente comando:

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

Para matarlos a todos, básicamente puedes escribir:

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

Aquí hay una prueba 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





En caso de que esto ayude a alguien más, la mayoría de las personas están aquí porque tienen algunos procesos detenidos que comenzaron, tal vez con antecedentes a través del shell. Necesitaba encontrar procesos, como root, detenidos por otros usuarios, para los cuales las variantes en el jobs comando no va a hacer.

Un poco de cavar alrededor con man ps me trajo a esto

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

Explicación: la -a bandera dice mostrar todos los procesos, entonces -o Controla la salida, qué información se mostrará sobre cada proceso. Estoy eligiendo pid, user, cmd (la línea de comando), y state, Cuál es el estado de proceso.

Desde 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

así que finalmente lo canalizo a grep T$ que dice, muéstrame todos los procesos que tienen T en la última columna.

Y luego tengo una buena lista de todos los procesos de diferentes usuarios que están en el estado detenido.

$ 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



Para obtener trabajos detenidos adjuntos al shell actual, jobs -ps Es más simple que esta respuesta. Dicho esto, esta respuesta no muestra solo los trabajos detenidos vía Ctrl-Z en una concha, pero Todos los trabajos detenidos: otros shells, otros usuarios., incluidos los trabajos que se están depurando (por ejemplo, por gdb). - Stéphane Gourichon