¿Cómo elimino la última tarea de fondo generada en Linux?
Ejemplo:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
¿Cómo elimino la última tarea de fondo generada en Linux?
Ejemplo:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Respuestas:
Hay una variable especial para esto en bash:
kill $!
PS se expande al PID del último proceso ejecutado en segundo plano.
^Z
no hace trabajos en segundo plano, los detiene. Un subsiguiente bg
realiza el 'fondo' real (reanuda la ejecución en segundo plano), y después de eso $!
funciona como se esperaba.
????
representa uno o más comandos que se ejecutarán después de matar, si alguno de esos comandos se basa en el trabajo realizado por el proceso en segundo plano, tenga en cuenta las tareas de limpieza o finalización que el proceso en segundo plano podría realizar en un controlador de señal después recibiendo una señal (atrapable). Es mejor agregar un wait
(seguido quizás por un sync
o incluso un sleep <n>
) justo antes del primero de dichos comandos 'dependientes'.
Puedes matar por número de trabajo. Cuando pones una tarea en segundo plano, verás algo como:
$ ./script &
[1] 35341
Ese [1]
es el número de trabajo y puede ser referenciado como:
$ kill %1
$ kill %% # Most recent background job
Para ver una lista de números de trabajo, use el jobs
comando. Más de man bash
:
Hay varias formas de referirse a un trabajo en el shell. El personaje
%
introduce un nombre de trabajo. El número de trabajon
se puede denominar como%n
. También se puede hacer referencia a un trabajo utilizando un prefijo del nombre utilizado para iniciarlo o una subcadena que aparece en su línea de comando. Por ejemplo, se%ce
refiere a unce
trabajo detenido . Si un prefijo coincide con más de un trabajo, bash informa un error. Usar%?ce
, por otro lado, se refiere a cualquier trabajo que contenga la cadenace
en su línea de comando. Si la subcadena coincide con más de un trabajo, bash informa un error. Los símbolos%%
y%+
consulte la noción del shell del trabajo actual, que es el último trabajo detenido mientras estaba en primer plano o se inició en segundo plano. Se puede hacer referencia al trabajo anterior usando%-
. En la salida correspondiente a los trabajos (p. Ej., La salida del comando de trabajos), el trabajo actual siempre se marca con a+
, y el trabajo anterior con a-
. Un solo%
(sin especificación de trabajo acompañante) también se refiere al trabajo actual.
set -m
), está destinado para uso interactivo. Ver stackoverflow.com/questions/690266/… también
%1
y %%
, especialmente. Algunas cosas no mueren en Ctrl-C, por lo que debe Ctrl-Z y luego kill -9 %%
. Un ejemplo donde lo encontré útil es: while true; do mplayer <some unstable online radio>; date >> restarts.log; done
- Ctrl-C solo lo llevará a la siguiente iteración del ciclo. Antes tenía que hacer ps
o tal vez jobs -l
, y luego volver a escribir el PID, lo cual es tedioso.
while true
con while sleep 1
. Esto le dará un breve retraso antes de reiniciar si puede vivir con eso, y si presiona ctrl-c dos veces, el segundo interrumpirá el sueño, finalizando con una salida distinta de cero y saliendo del bucle.
Esto debería matar todos los procesos en segundo plano:
jobs -p | xargs kill -9
kill -9 %%
está escribiendo menos :)
Esta es una respuesta fuera de tema, pero, para aquellos que estén interesados, puede ser valiosa.
Como en la respuesta de @John Kugelman,% está relacionado con la especificación del trabajo. ¿Cómo encontrar eso de manera eficiente? use el comando less's & pattern , parece que man usa menos buscapersonas (no está tan seguro), en man bash escriba &% luego escriba Enter solo mostrará líneas que contengan '%', para volver a mostrar todo, escriba &. luego Enter.
Solo usa el comando killall:
killall taskname
Para obtener más información y opciones más avanzadas, escriba "man killall".
killall python
o killall java
, mientras se tiene algo útil ejecutándose en otras partes del sistema.