¿Cómo puedo eliminar un proceso por nombre en lugar de PID?

349

A veces, cuando intento iniciar Firefox, dice "ya se está ejecutando un proceso de Firefox". Entonces tengo que hacer esto:

jeremy@jeremy-desktop:~$ 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
jeremy@jeremy-desktop:~$ kill 7451

Lo que me gustaría es un comando que haga todo eso por mí. Tomaría una cadena de entrada y greppara ello (o lo que sea) en la lista de procesos, y eliminaría todos los procesos en la salida:

jeremy@jeremy-desktop:~$ killbyname firefox

Intenté hacerlo en PHP, pero exec('ps aux')parece que solo muestra procesos que se han ejecutado exec()en el script PHP en sí (por lo que el único proceso que muestra es en sí mismo).

Jeremy Ruten
fuente
Cuando aparece la ventana que dice que Firefox ya se ejecuta, generalmente solo tengo que esperar un segundo y puedo volver a ejecutar Firefox (por supuesto, puede que no sea siempre el caso).
nuoritoveri
1
Esta es la forma más segura como JohnB dice en esta respuesta: stackoverflow.com/questions/6381229/…
tecnoshopbq
Esta es una pregunta antigua, pero ¿podría cambiar la respuesta aceptada? El que marcó falla con muchos procesos, como los que ejecuta JVM.
Luís de Sousa
Para cualquiera que haga referencia a este tema, en el comentario anterior, Luis hace referencia a la respuesta a continuación que promociona el pkill -f "Process name"comando ...
Digger

Respuestas:

505
pkill firefox

Más información: http://linux.about.com/library/cmd/blcmdl1_pkill.htm

shoosh
fuente
77
Usar pgrep para descubrir lo que estás matando antes de pasar por los procesos de matanza es una buena cosa. Especialmente cuando se usa -f.
Akrikos
pkill no es muy amigable. no puedes darle nombres de la misma manera que killall los toma.
Octopus
2
pkill -U <username>Es bastante útil. Tengo un servidor web Solaris , el demonio del servidor web real, está configurado como un Servicio con su propio usuario. Por lo tanto, especificar por usuario es una forma simple / fácil de activar un reinicio.
Raystorm
66
Para forzar la muerte: pkill -9 firefox
Justas
Esto funciona la mitad de las veces en el mejor de los casos. Necesita al menos la -fbandera para una solución ómnibus.
Luís de Sousa
112

También es posible usar:

pkill -f "Process name"

Para mí, funcionó perfectamente. Era lo que estaba buscando. pkill no funciona con nombre sin la bandera.

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

Víctor
fuente
2
especialmente para correr algo con vino, la -fopción es realmente necesaria. por ejemplopkill -f "EvilWindowsServer.exe"
CodeBrauer
Esta debería ser la respuesta aceptada. La primera respuesta falla con muchos tipos de programas, por ejemplo, aquellos que se ejecutan en una JVM.
Luís de Sousa
1
También tuve que agregar la -fbandera para eliminar un proceso en segundo plano que ejecuta un script de Python.
Mason
en mi caso, necesitaba 2 banderas:pkill -f -9 PROCESSNAME
Slavik
su trabajo en centos7.gracias
sirmagid
64

Puede matar procesos por nombre conkillall <name>

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

Las señales se pueden especificar por nombre (por ejemplo, -HUP o -SIGHUP ) o por número (por ejemplo, -1 ) o por la opción -s .

Si el nombre del comando no es una expresión regular (opción -r ) y contiene una barra inclinada (/), los procesos que ejecutan ese archivo en particular se seleccionarán para matar, independientemente de su nombre.

Pero si no ve el proceso con ps aux, probablemente no tendrá derecho a matarlo ...

Andre Bossard
fuente
66
Para forzar la finalización de un programa que no responde, envíe KILL en lugar de TERM:killall -s KILL firefox
Martin Hansen
45

Una alternativa un poco más larga:

kill `pidof firefox`
Walter
fuente
25
pidof firefox | xargs kill -9
hbt
1
este funciona en busybox para sus dispositivos integrados :)
nwgat
25

La forma más fácil de hacerlo es comprobar primero si está obteniendo los ID de proceso correctos con:

pgrep -f [part_of_a_command]

Si el resultado es el esperado. Ir con:

pkill -f [part_of_a_command]
Tahsin Turkoz
fuente
19

Extraño, pero no he visto una solución como esta:

kill -9 `pidof firefox`

También puede matar múltiples procesos (múltiples pids) como:

kill -9 `pgrep firefox`

Prefiero pidofya que tiene salida de línea única:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316
prosti
fuente
Cuando ejecuto esto, recibí el error kill: invalid number 'pidof myprogram'. ¿Qué hay de malo aquí?
Brethlosze
esto me salvó la vida hoy ... No quiero escribir más pero me alegro de haberlo encontrado aquí. gracias hombre.
MilMike
1
Llega tarde, pero en caso de que alguien más se pregunte ... @Brethlosze pones ticks individuales, mientras que el comando requiere tics.
espectras
Gracias! .. estaré (y estoy siendo) consciente de estos backticks :)
Brethlosze
13

Mata a todos los procesos que tienen snippeten la ruta de inicio. Puede eliminar todas las aplicaciones iniciadas desde algún directorio colocando / directorio / como un fragmento. Esto es bastante útil cuando inicia varios componentes para la misma aplicación desde el mismo directorio de aplicaciones.

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

* Preferiría pgrep si está disponible

Miguel
fuente
1
Esta es una combinación frecuente de antipatrones. Use una expresión regular que no coincida (o el nombre de la secuencia de comandos que contiene) y evite una inútilgrep . ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
tripleee
1
evitando grep inútil, no está evitando errores tipográficos y la capacidad de usar el comando en procesos automatizados que parametrizan el <snippet>
Mike
¡ESTA es de hecho la mejor manera de hacerlo!
Abhinandan Dubey
Sería genial entender por qué @ tripleee's [s]funciona en términos de no coincidir con el proceso awk en sí mismo.
andig
Porque la expresión regular [x]ycoincide con la cadena xypero no al revés. Esta es una pregunta frecuente común. El enlace es a una página de hace más de 20 años que explica esto con más detalle; y esta era una pregunta recurrente ya entonces.
tripleee
11

En Mac no pude encontrar el pgrep y pkill ni Killall funcionaba, así que escribí un script simple:

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

Si hay una manera más fácil de hacerlo, por favor comparta.

Dhiraj
fuente
1
Jajaja Este es un comando loco para tal tarea. No importa. ¿Llamaste a esa simple línea? : D Simple es killall
m3nda
@ erm3nda :-) De acuerdo. Mirando hacia atrás, parece una locura. No puedo recordar por qué Killall no estaba funcionando en mi Mac entonces.
Dhiraj
Esto es muy útil cuando quieres matar un cierto proceso de Java como "jboss". En ese caso, Killall no ayuda.
Jan M
9

Usando el #killallcomando:

#killall -9 <processname>
usuario2396265
fuente
6

Para matar con grep:

kill -9 `pgrep myprocess`
edW
fuente
5

más correcto sería:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid
Chadiso
fuente
1
¿Por qué exportusa una variable que solo va a usar una vez en el mismo proceso?
tripleee
3

Me hacía la misma pregunta, pero el problema con las respuestas actuales es que no verifican con seguridad los procesos que se van a matar, por lo que ... podría dar lugar a terribles errores:) ... especialmente si varios procesos coinciden con el patrón .

Como descargo de responsabilidad, no soy un sh pro y ciertamente hay margen de mejora.

Entonces 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
Fabuloso
fuente
2

Si ejecuta GNOME, puede usar el monitor del sistema (Sistema-> Administración-> Monitor del sistema) para eliminar los procesos como lo haría con Windows. KDE tendrá algo similar.

Bernardo
fuente
2

El killcomando predeterminado acepta nombres de comandos como una alternativa al PID. Ver kill (1) . Un problema frecuente es que bashproporciona el suyo propio killque acepta números de trabajo, como kill %1, pero no nombres de comandos. Esto dificulta el comando predeterminado. Si la funcionalidad anterior es más útil para usted que la última, puede deshabilitar la bashversión llamando

enable -n kill

Para más información ver killy enableentradas en bash (1) .

El vee
fuente
¿Cómo volví a activar la acción enable -n kill?
Brethlosze
1
@hyprfrcbenable kill
The Vee
1

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

Nived Thanima
fuente
0
ps aux | grep processname | cut -d' ' -f7 | xargs kill -9 $
Puerto de consulta
fuente
0

awk oneliner, que analiza el encabezado de pssalida, por lo que no necesita preocuparse por los números de columna (sino por los nombres de columna). Apoyo regex. Por ejemplo, para eliminar todos los procesos, cuyo nombre ejecutable (sin ruta) contiene la palabra "firefox" intente

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
Andrey Bochkov
fuente