Encontrar la identificación de un proceso y matarlo

16

Cuando necesito matar un proceso en segundo plano que hago ps -e | grep <process_name>

Lo que imprime algo como esto 1766 ? 00:00:13 conky, luego uso la ID del proceso de killesta manera kill 1766.

¿Hay alguna manera de simplificar esto? ¿Hacerlo más rápido? reducir la cantidad de mecanografía?

Gautama
fuente
1
He recibido la respuesta que quiero, pero esperaré un tiempo antes de aceptar para que la comunidad pueda beneficiarse de las diversas opciones disponibles.
Gautam
Por favor, siéntase libre de hacer esta pregunta más genérica, si es posible, para que más personas puedan beneficiarse de las respuestas
Gautam

Respuestas:

19

(TL, DR: pgrep, pkill)

Muchas variantes de Unix vienen con el pgrepy su compañero pkill: Solaris , Linux (parte de las utilidades de proceso estándar , puede estar ausente de los sistemas Linux integrados), FreeBSD , OpenBSD , NetBSD , ... pero solo de MacPorts en OS X , no AIX , y solo recientemente en HP-UX . La pgreputilidad muestra el ID del proceso de los procesos que coinciden con el nombre, el usuario y algunos otros criterios. El argumento de pgrepse interpreta como una expresión regular que debe coincidir con parte del nombre del ejecutable del proceso (a menos que pase una opción para cambiar esto). Si llamas en pkilllugar depgrep, la utilidad envía una señal en lugar de mostrar las ID de proceso.

Otra utilidad similar es pidof . En Linux , es proporcionado por SysVinit o BusyBox (por lo que a menudo lo encontrará en un sistema Linux incorporado que no tiene pgrep); También hay puertos en otras variantes de Unix. La pidofutilidad tiene menos opciones, en su mayoría solo coincide con nombres de archivos ejecutables completos. Su utilidad complementaria killallenvía una señal a los programas coincidentes¹.

¹ Tenga cuidado porque killalltiene un significado diferente en Solaris y posiblemente en otras variantes de Unix; no escriba killallcomo root en Solaris.

Gilles 'SO- deja de ser malvado'
fuente
Wow tu respuesta es muy detallada, mucho más profunda, gracias. Edite la pregunta para que coincida con la respuesta si es posible.
Gautam
@GautamK No creo que la pregunta deba ampliarse. Si lo hace, no dude en editarlo usted mismo.
Gilles 'SO- deja de ser malvado'
De las respuestas con la mayor cantidad de votos Su respuesta da más detalles, así que la estoy aceptando
Gautam
8
  • killall ProcessName (Hay una desventaja con este comando en que no siempre conoce el nombre del proceso de un programa).
  • pidof ProccessName y kill the result form pidof
  • ps xu | grep <process name> | grep -v grep | awk '{ print $2 }' | xargs kill -9 Pruebe esta línea y reutilícela en el historial de su bash, o mejor cree un alias para ella.
Hanan N.
fuente
El segundo pidofparece un poco más fácil, pero aún así toma 2 pasos
Gautam
Puedo buscar / crear un comando de una línea que haga eso en un paso (con un nombre de proceso aproximado) pero eso requeriría que escribas una línea larga (que es más difícil que los dos pasos anteriores), o puedes escribirla una vez y reutilizarlo de la historia.
Hanan N.
@GautamK He actualizado la respuesta con la opción de comando único.
Hanan N.
6

Si bien Hanan tiene algunas buenas sugerencias, agregaré pgrep/ pkill. Permiten un control mucho más preciso sobre el proceso que encuentras, y expresiones regulares si no conoces el proceso preciso que deberás matar.

PS Hanan pidofse puede alimentar killdirectamente con backticks:

kill `pidof processname`
Kevin
fuente
pkillera exactamente lo que estaba buscando, que la mayor parte del tiempo sé el nombre del proceso, su Parcialmente conkyo firefoxo chromeo algo por el estilo. Gracias
Gautam
1

Qué tal esto -

ps -e | awk '$4~/<process name>/{print $1}' | xargs kill

Ejemplo:

[jaypal:~/Temp] sleep 100&
[1] 74863
[jaypal:~/Temp] ps -e | awk '$4~/sleep/{print $1}' | xargs kill
[1]+  Terminated: 15          sleep 100

Actualizar:

Lo sentimos, esto obviamente no cumple con el requisito de escribir menos, por lo que una buena forma de hacerlo sería agregar un functiona su .bashrc, .profileo lo que sea, el script de inicio. La función puede ser algo como esto:

killp() {
awk -v pname="$1" '($4==pname){print $1}' <(ps -e) | xargs kill
}

Una vez agregado, simplemente puede pasar el nombre de su proceso:

[jaypal:~] sleep 100&
[1] 77212
[jaypal:~] killp sleep
[1]+  Terminated: 15          sleep 100
jaypal singh
fuente