2009-10-26 18 views
153

¿Cómo puedo matar la última tarea de fondo engendrada en Linux?linux: matar a la tarea de fondo

Ejemplo:

doSomething 
doAnotherThing 
doB & 
doC 
doD 
#kill doB 
???? 
+16

¿Cómo puede esto no estar relacionado con la programación? ¿La programación Bash no es programación? – flybywire

+3

Pertenece al superusuario en mi humilde opinión. – Hasturkun

+5

Esto está en la región de superposición entre SO y SU, pero creo que se ajusta mejor aquí en SO. Mi criterio para pensar de esta manera es que si @flybywire está haciendo esto en un script, es programación. Si solo quisiera hacerlo desde la línea de comando, diría que pertenece a la UB. –

Respuesta

184

Hay una variable especial para esto en bash:

kill $! 

$! se expande al PID del último proceso ejecutado en segundo plano.

+16

Esto no funciona para trabajos con '^ Z'. – polm23

+56

@ polm23; no, '^ Z' no genera trabajos en segundo plano, los detiene. Un 'bg' posterior hace el 'fondo' real (reanuda la ejecución en el fondo), y después de eso' $! 'Funciona como se esperaba. – falstro

+0

Suponiendo que el '' ???? representa uno o más comandos que se ejecutarán después de la matanza, si alguno de estos comandos se basa en el trabajo realizado por el proceso en segundo plano, ser conscientes de cualquier limpieza o tareas de acabado de maquillaje que el proceso en segundo plano podría funcionar en un controlador de señal después de recibir una señal (capturable). Lo mejor es agregar un 'wait' (seguido quizás por' sync' o incluso 'sleep ') justo antes del primero de esos comandos 'dependientes'. – ack

1

Es necesario utilizar su pid ... "ps -A" para encontrarlo.

-1

sólo tiene que utilizar el comando killall:

killall TaskName

para obtener más información y opciones más avanzadas, tipo "hombre killall".

+4

Creo que killall es un poco agresivo cuando realmente tiene fácil acceso al PID. Y peligroso, también, especialmente si eres root –

+2

No es muy útil, si tienes que 'killall python' o' killall java', mientras tienes algo útil ejecutándose en otra parte del sistema. –

2
skill doB 

skill es una versión del comando kill que le permite seleccionar uno o varios procesos en base a un criterio dado.

247

Puede matar por número de trabajo. Cuando se pone una tarea en segundo plano verá algo como:

$ ./script & 
[1] 35341 

Eso [1] es el número de trabajo y puede hacer referencia como:

$ kill %1 
$ kill %% # Most recent background job 

Para ver una lista de números de trabajo utilice el jobs comando. Más de man bash:

Hay una serie de formas de referirse a un trabajo en el shell. El carácter % introduce un nombre de trabajo. El número de trabajo n puede ser denominado %n. También se puede hacer referencia a un trabajo utilizando un prefijo del nombre utilizado para iniciarlo, o utilizando una subcadena que aparece en su línea de comando. Por ejemplo, %ce se refiere a un trabajo detenido ce. Si un prefijo coincide con más de un trabajo, bash informa un error. El uso de %?ce, por otro lado, se refiere a cualquier trabajo que contenga la cadena ce en su línea de comando. Si la subcadena coincide con más de un trabajo, bash informa de un error. Los símbolos %% y %+ se refieren a la noción de shell del trabajo actual, que es el último trabajo detenido mientras estaba en primer plano o se inició en segundo plano. El trabajo anterior puede llamarse al usando %-. En la salida correspondiente a trabajos (por ejemplo, la salida del comando de trabajos), el trabajo actual siempre es marcado con un +, y el trabajo anterior con un -. Un solo % (sin ninguna especificación de trabajo adjunta) también se refiere al trabajo actual .

+0

Para el registro, creo que esto solo funciona si el control de trabajo está habilitado. Aunque creo que puede activarlo en scripts ('set -m'), está destinado para uso interactivo. Ver http://stackoverflow.com/questions/690266/why-cant-i-use-job-control-in-a-bash-script así – falstro

+6

símbolos muy útiles, estos '% 1' y' '%% - especialmente. Algunas cosas no mueren en Ctrl-C, por lo que necesita Ctrl-Z ellos, y luego 'matar -9 %%'. Un ejemplo en el que lo encontré útil es: 'mientras es verdadero; do mplayer ; fecha >> reinicia.log; done' - Ctrl-C te llevará a la siguiente iteración del bucle. Antes tenía que hacer 'ps' o quizás' jobs -l', y luego volver a escribir el PID, lo cual es tedioso. –

+0

¿Hay uno para todos los trabajos? – CMCDragonkai

40

El siguiente comando le proporciona una lista de todos los procesos en segundo plano en su sesión, junto con el pid. Luego puede usarlo para matar el proceso.el uso

jobs -l 

Ejemplo:

$ sleep 300 & 
$ jobs -l 
[1]+ 31139 Running     sleep 300 & 
$ kill 31139 
20

Esto debe matar a todos los procesos en segundo plano:

jobs -p | xargs kill -9 
+1

Esto es lo que haría uso de antes, pero '' kill -9 %% es inferior a escribir :) –

+4

@TomaszGandor que matará sólo el trabajo actual es decir, el último trabajo se detuvo en primer plano o en segundo plano comenzado. El comando en la respuesta matará TODOS los trabajos. – bitek

+3

[no matar -9] (http://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process) – lesmana

0

este es un fuera de tema respuesta, pero, para aquellos que estén interesados, podría ser valiosa .

Al igual que en la respuesta de @ John Kugelman,% está relacionado con la especificación de trabajo. ¿cómo encontrarlo de manera eficiente? use less & comando de patrón, parece que el hombre usa menos buscapersonas (no es seguro), en el tipo de hombre bash &% y luego escriba Entrar solo mostrará líneas que contengan '%', para volver a mostrar todo, escriba &. luego Entrar.

Cuestiones relacionadas