2008-10-02 18 views
237

Por ejemplo, a veces, cuando intento iniciar Firefox, dice que ya se está ejecutando un proceso de Firefox. Así que tengo que hacer esto:¿Cómo puedo matar un proceso por nombre en lugar de PID?

[email protected]:~$ ps aux | grep firefox 
jeremy 7451 25.0 27.4 170536 65680 ?  Sl 22:39 1:18 /usr/lib/firefox-3.0.1/firefox 
jeremy 7578 0.0 0.3 3004 768 pts/0 S+ 22:44 0:00 grep firefox 
[email protected]:~$ kill 7451 

Lo que me gustaría es un comando que hiciera todo eso por mí. Se necesitaría una cadena de entrada y grep para él (o lo que sea) en la lista de procesos, y mataría a todos los procesos en la salida:

[email protected]:~$ killbyname firefox 

He intentado hacerlo en PHP, pero exec ('ps aux') parece que sólo los procesos muestran que se han ejecutado con exec() en el script PHP en sí (por lo que el único proceso que muestra es en sí)

+0

Cuando aparece la ventana que dice que Firefox ya se ejecuta, normalmente solo tengo que esperar un segundo y puedo ejecutar Firefox nuevamente (por supuesto, puede no ser siempre el caso). – nuoritoveri

+1

Esta es la manera más segura que JohnB dice en esta respuesta: http://stackoverflow.com/questions/6381229/how-to-kill-all-processes-matching-a-name/19733066#19733066 – tecnoshopbq

+0

Posible duplicado de [Buscar y eliminar un proceso en una línea usando bash y regex] (http://stackoverflow.com/questions/3510673/find-and-kill-a-process-in-one-line-using-bash-and-regex) – tripleee

Respuesta

55

Puede matar procesos por nombre con killall <name>

killall envía una señal a todos los procesos en ejecución cualquiera de las comandos especificados. Si no se especifica ningún nombre de señal , se envía SIGTERM.

señales pueden especificarse ya sea por nombre (por ejemplo -HUP o -SIGHUP) o por número (por ejemplo -1) o por opción -s.

Si el nombre del comando no es expresión regular (opción -r ) y contiene una barra (/), los procesos de ejecución que archivo en particular será seleccionado para muerte, independientemente de su nombre.

Pero si no ve el proceso con ps aux, es probable que no tienen derecho a matarlo ...

+0

Espera, espera. ¿'Ps aux' no enumera todos los procesos de todos los usuarios que se ejecutan en el sistema? ¿Qué procesos no se muestran? –

+3

Para forzar la terminación de un programa que no responde, envíe KILL en lugar de TERM: 'killall -s KILL firefox' –

0

Si ejecuta GNOME, puede utilizar el monitor del sistema (System- > Administración-> Monitor del sistema) para matar procesos como lo haría en Windows. KDE tendrá algo similar.

35

un poco más alternativa:

kill `pidof firefox` 
+21

pidof firefox | xargs kill -9 – hbt

+1

@hbt ¡¡Tuyo es el único que trabaja para mí !! –

+1

este funciona bajo busybox para sus dispositivos incrustados :) – wiak

10

En Mac no pude encontrar el pgrep y pkill tampoco era killall trabajar tan escribió un script sencillo de un trazador de líneas: -

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid 

Si hay un más fácil forma de hacerlo, por favor comparte.

+1

Ambos 'pkill' y' pgrep' funcionan en mi Mac. Parecen estar allí fuera de la caja ... – johk95

+1

Lol. Este es un comando insano para tal tarea. No importa. ¿Llamaste a esa simple línea? : D Simple es killall – erm3nda

+0

@ erm3nda :-) De acuerdo. Mirando hacia atrás parece loco. No puedo recordar por qué Killall no estaba trabajando en mi mac entonces. – Dhiraj

8

Usando #killall comando:

#killall -9 <processname> 
4

más correcto sería:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid 
3

para matar con grep:

kill -9 `pgrep myprocess` 
48

también es posible utilizar:

pkill -f "Process name".

Para mí funciona perfecto, era lo que estaba buscando. En mi caso sin bandera, pkill no funcionaba con el nombre.

Cuando se establece -f, la línea de comando completa se utiliza para la coincidencia de patrones.

+0

especialmente para ejecutar algo con * wine * la opción '-f' es realmente necesaria. p.ej. 'pkill -f" EvilWindowsServer.exe "' – CodeBrauer

+0

Esta debería ser la respuesta aceptada. La primera respuesta falla con muchos tipos de programas, p. aquellos corriendo en una JVM. –

1

El comando predeterminado kill acepta nombres de comando como alternativa al PID. Ver kill (1). Un problema frecuente es que bash proporciona su propio kill que acepta números de trabajo, como kill %1, pero no nombres de comando. Esto obstaculiza el comando predeterminado. En el primer caso la funcionalidad es más útil para usted que este último, puede desactivar la versión bash llamando

enable -n kill

Para más información ver kill y enable entradas en bash (1).

+0

¿Cómo puedo volver a habilitar la acción realizada por 'enable -n kill'? – hyprfrcb

+1

@hyprfrcb 'enable kill' –

1

Me estaba preguntando la misma pregunta, pero el problema con las respuestas actuales es que no seguro comprobar los procesos para ser asesinados así que ... que podría dar lugar a errores terribles:) ... especialmente si varios procesos coinciden con el patrón.

Como un descargo de responsabilidad, no soy un profesional y definitivamente hay margen de mejora.

Así que escribí un pequeño script sh:

#!/bin/sh 

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep) 
if [ ! "${killables}" = "" ] 
then 
    echo "You are going to kill some process:" 
    echo "${killables}" 
else 
    echo "No process with the pattern $1 found." 
    return 
fi 
echo -n "Is it ok?(Y/N)" 
read input 
if [ "$input" = "Y" ] 
then 
    for pid in $(echo "${killables}" | awk '{print $2}') 
    do 
    echo killing $pid "..." 
    kill $pid 
    echo $pid killed 
    done 
fi 
-1
ps aux | grep processname | cut -d' ' -f7 | xargs kill -9 $ 
-1

kill -9 $ (ps aux | grep -e myprocessname | awk '{print $ 2}')

12

La forma más fácil En primer lugar, compruebe que está recibiendo los ID de proceso correctos con:

pgrep -f [part_of_a_command] 

Si el resultado es el esperado.Voy con:

pkill -f [part_of_a_command] 
8

extraño, pero no he visto la solución como esta:

kill -9 `pidof firefox` 

también puede matar a múltiples procesos (múltiples PID) como:

kill -9 `pgrep firefox` 

I prefiera pidof ya que tiene salida de línea única:

> pgrep firefox 
6316 
6565 
> pidof firefox 
6565 6316 
+0

Cuando ejecuto esto, obtengo el error' kill: invalid number 'pidof myprogram''. ¿Qué hay de malo aquí? – hyprfrcb

+0

esto acaba de salvar mi vida hoy ... No quiero escribir más, pero me alegro de haberlo encontrado aquí. gracias hombre. – MilMike

1

Mata a todos los procesos que tengan snippet en la ruta de inicio. Puede matar todas las aplicaciones iniciadas desde algún directorio por poner/directory/como un fragmento. Esto es bastante útil cuando inicia varios componentes para la misma aplicación desde el mismo directorio de la aplicación.

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill 
Cuestiones relacionadas