2010-05-05 26 views
39

¿Cómo matar un proceso que se está ejecutando en bash - por ejemplo, supongamos que abrir un archivo:matar a un proceso en bash

$ gedit archivo.txt

¿hay alguna manera dentro del símbolo del sistema para cerrarlo? Este ejemplo es bastante trivial, ya que podría cerrar la ventana, pero parece subir un poco, especialmente cuando escribo mal los comandos.

También hay alguna forma de escapar de un ejecutable que se está ejecutando? Esto probablemente tiene la misma solución, pero pensé que podría preguntar de todos modos.

Gracias

+0

Esto se parece más a una pregunta de uso de shell que a una pregunta de programación de shell: las mejores prácticas son diferentes entre scripts y el uso interactivo, y esta última pertenece al superusuario ra más que SO. –

+0

No veo cómo debería ser un duplicado de la pregunta vinculada. Esta pregunta pregunta sobre matar el proceso que se está ejecutando en la terminal actual. La pregunta "duplicada" pregunta acerca de la identificación del proceso de algún proceso arbitrario para matar. – luator

Respuesta

33

para interrumpirlo, puede intentar presionar ctrl c para enviar un SIGINT. Si no lo detiene, puede intentar eliminarlo usando kill -9 <pid>, que envía un SIGKILL. Este último no puede ser ignorado/interceptado por el proceso en sí (el que está siendo asesinado).

Para mover el proceso activo a fondo, puede pulsar Ctrl z.El proceso se envía a segundo plano y se vuelve al prompt del shell. Use el comando fg para hacer lo opuesto.

+6

Me sorprende que nadie haya mencionado Ctrl-Z o Ctrl-C todavía. Ctrl-C le pide severamente al programa en ejecución que se cierre. Ctrl-Z siempre debe funcionar en un programa, pero algunos programas anulan Ctrl-C con un manejador de señal, y el manejador de señal no siempre cierra el programa. –

+3

Después de pausar el proceso con ctrlz, puede matarlo con 'kill -9%'. – luator

+0

Una cosa más para agregar: si el proceso no reacciona a Ctrl + C (que envía SIGINT), puede ser un poco más brutal y usar Ctrl + \ para enviar un SIGQUIT. – luator

64

usted tiene un múltiples opciones:

En primer lugar, puede utilizar kill. Pero necesita el pid de su proceso, que puede obtener usando ps, pidof o pgrep.

ps -A // to get the pid, can be combined with grep 
-or- 
pidof <name> 
-or- 
pgrep <name> 

kill <pid> 

Es posible matar un proceso simplemente conociendo el nombre. Use pkill o killall.

pkill <name> 
-or- 
killall <name> 

Todos los comandos envían una señal al proceso. Si el proceso colgó, podría ser necesario recurrir a enviar un sigkill al proceso (este es el número de señales 9, por lo que los siguientes ejemplos que hagan lo mismo):

pkill -9 <name> 
pkill -SIGKILL <name> 

Puede utilizar esta opción con kill y killall, también.

Lea este artículo acerca de controlling processes para obtener más información sobre los procesos en general.

+2

Otra opción es 'killall -9 ', o kill -9 '' pidof '' – jweyrich

+0

@jweyrich: Gracias - Edité mi respuesta para reflejar esto. – tanascius

+2

Tenga cuidado con 'killall'. En Solaris, 'killall' matará a todos los procesos activos. Yo recomendaría usar '' kill'' o '' pkill''. –

1

Puede usar el comando pkill para eliminar procesos. Si quiere "jugar", puede usar "pgrep", que funciona exactamente igual pero devuelve el proceso en lugar de matarlo.

pkill tiene el parámetro -f que le permite hacer coincidir todo el comando. Así que para su ejemplo, puede: pkill -f "archivo.txt gedit"

8

tratar kill -9 {processID}

Para encontrar el ID de proceso se puede utilizar ps -ef | grep gedit

+6

Ese -9 es un poco duro en un proceso normal, es mejor que solo lo use en algo que no reacciona a una solicitud de 'muerte' normal. –

+1

también consideran utilizar pgrep en lugar de grepping ps, particularmente al escribir scripts –

0

No me queda claro lo que entendemos por "escape un ejecutable que se está ejecutando", pero ctrl-z pondrá un proceso en segundo plano y devolverá el control a la línea de comando. A continuación, puede utilizar el comando fg para volver a poner el programa en primer plano.

4

Publicación anterior, pero me encontré con un problema muy similar. Después de algunos experimentos, encontré que usted puede hacer esto con un solo comando:

kill $(ps aux | grep <process_name> | grep -v "grep" | cut -d " " -f2) 

En el caso de OP, <process_name> sería "gedit file.txt".

+2

No funciona aunque se vea bien. Pero esto funciona: ps -ef | grep yourproc | awk '{print $ 2}' | xargs kill – Timo

+1

El separador no es bueno. Debes ajustarlo antes. esto debería funcionar: kill -9 $ (ps aux | grep "worker-manager-rsync" | grep -v "grep" | tr -s "" | cut -d "" -f 2) – ikken

+0

funciona! solo cambio el último dígito kill $ (ps aux | grep | grep -v "grep" | cut -d "" -f3) –

0

favor verifique comando "top" entonces, si la secuencia de comandos o cualquier están ejecutando tenga en cuenta 'PID'

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
1384 root  20 0 514m 32m 2188 S 0.3 5.4 55:09.88 example 
14490 root  20 0 15140 1216 920 R 0.3 0.2 0:00.02 example2 



kill <you process ID> 

Example : kill 1384 
4

Éste es el uso violento con precaución:

pkill -9 -e -f processname 

Si el nombre del proceso es "sh" también matará a "bash"

Cuestiones relacionadas