Cuando intento salir de mi servidor Linux recibo el mensaje:
Hay trabajos detenidos.
: ¿Hay un solo comando para matar a estos?
shopt -s checkjobs
mi .bashrc
Cuando intento salir de mi servidor Linux recibo el mensaje:
Hay trabajos detenidos.
: ¿Hay un solo comando para matar a estos?
shopt -s checkjobs
mi .bashrc
Respuestas:
Para eliminar rápidamente todos los trabajos detenidos debajo de bash, ingrese:
kill -9 `jobs -ps`
jobs -ps
enumera los ID de proceso ( -p
) de los -s
trabajos detenidos ( ).
kill -9 `jobs -ps`
envía señales de SIGKILL a todos ellos.
sudo kill `jobs -p`
funcionó pero explícitamente escribiendo PID sí.
kill
como esto no hará nada, ya que los procesos se detienen, no procesarán el SIGTERM (-15) que se les envía por defecto.
Intenta escribir esto:
kill -9 $(jobs -p)
La respuesta aceptada mataría todos los trabajos (que es suficiente en este caso) y no solo los que se detuvieron. Si quieres matar solo a los detenidos, ejecuta:
kill $(jobs -l | grep Stopped | cut -d' ' -f3)
awk '/Stopped/{print $3}')
-s
argumento sobre la respuesta aceptada filtra solo a los detenidos
La forma más fácil es en realidad volver a intentar la salida inmediatamente; bash
tomará eso como "matar todos los trabajos detenidos y salir".
for x in `jobs -p` ; do kill -9 $x ; done
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 en segundo plano a través del shell. Necesitaba encontrar procesos, como root, detenidos por otros usuarios, para los cuales las variantes en el jobs
comando no funcionarían.
Un poco de investigación man ps
me llevó a esto:
ps -a -o pid,user,cmd,state | grep 'T$'
Explicación: la -a
bandera dice mostrar todos los procesos, luego -o
controla la salida, qué información se mostrará sobre cada proceso. Estoy eligiendo pid
, user
, cmd
(la línea de comandos), y state
, lo que es el estado del proceso .
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
así que finalmente lo canalizo a lo 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 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
jobs -ps
es más simple que esta respuesta. Dicho esto, esta respuesta no muestra solo los trabajos detenidos a través Ctrl-Z
de un shell, sino todos los trabajos detenidos: otros shells, otros usuarios , incluidos los trabajos que se están depurando (por ejemplo, por gdb).
ps -el | grep T
para encontrar los procesos en el estado 'T'.
Si desea eliminar algunos trabajos detenidos pero no todos, intente esto:
Primero, enumere los trabajos, obtendrá algo como esto:
$ jobs -l
[2] 4813 Stopped ./parse < call.txt
[3]- 4819 Stopped ./parse < call.txt
enviar kill 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
Normalmente, si recibió ese mensaje, debe cerrar la sesión dos veces. Por ejemplo, primero Ctrl+Dle da el mensaje de advertencia para informarle sobre los trabajos detenidos, presionar por segunda vez lo desconectará y matará los trabajos. Esto mismo se aplica a las logout
y exit
los comandos.
Para matarlos de forma manual, trate: kill $(jobs -p)
.
Si no desea eliminar trabajos de su shell actual, puede eliminarlos de la tabla de trabajos activos sin eliminarlos mediante el disown
comando. P.ej
$ sleep 1000 &
[1] 19404
$ jobs
[1]+ Running sleep 1000 &
$ disown
Trabajos detenidos también se puede determinar por el estado del proceso ( T
carácter) que significa que el proceso se detuvo por la señal tal como SIGSTOP
, SIGTSTP
u otro (como SIGTTIN
, o SIGTTOU
).
En caso de que jobs
un comando integrado de shell no esté disponible, los procesos detenidos se pueden enumerar 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