Matando procesos con Expresiones Regulares

Publicado el Jueves, 10 de julio de 2008

Siguiendo con el tema de Expresiones regulares, que de a poco se va borrando de la lista "Por hacer" y va entrando en la lista "lo que estoy aprendiendo". De a poco lo voy integrando con el resto de las cosas que aprendí/aprendo. Les cuento cómo me vino muy práctico para solucionar un problema bastante tedioso.

Tengo en IceWeasel la extensión "FlashGot", que me permite descargar archivos con el gestor KGet. Lo malo es que al instalarlo agrega al menú contextual de IceWeasel, entre otras opciones, "Descargar todo". Esto ocasiona que el programa siga TODOS los enlaces de la página, preguntándome por cada uno dónde lo quiero guardar. Así, pueden aparecer cientos de diálogos de KGet, uno por cada link del sitio. Ya deshabilité de las opciones las sobrecargas del menú contextual por cierto.

Pero en cierto momento, apreté sin querer esta opción, y tenía que ir cancelando a mano uno por uno los diálogos. ¡Tiene que haber una forma más fácil! Y la hay, ya que estoy "empapado en el tema" vamos a verlo:

TerminalVamos a la consola, sé que con ps puedo ver los procesos que corren en el sistema. Seguramente pueda filtrar los ID's de aquellos que tengan el nombre "kget".

El man del comando ps, nos dice que para listar todos los procesos del sistema de la forma estándar usamos:

ps -e
ps -ef
ps -eF
ps -ely

El formato en que imprime la información ps es el siguiente:
PID TTY TIME CMD
Por lo que si usamos awk sobre esa salida, tenemos que $1 es el PID, $2 el TTY, $3 TIME y $4 CMD. Se me ocurren un montón de formas de hacerlo, pero voy a mostrar la que usé:

kill `ps -e | awk '/kget/{print $1}'`

Lo que escribí dentro de las comillas `` da el ID de los procesos que tengan la cadena "kget" dentro del nombre. Reenvío la salida de "ps -e" por pipe a un awk. Éste awk revisa todas las líneas de dicha salida, e imprime el ID ($1) de aquellas que contengan la cadena "kget". Esto es "atrapado" con las comillas ``, y enviado al comando kill.

Otra forma de hacerlo puede ser usando grep:

kill `ps -e | grep kget | awk '{print $1}'`

El procedimiento sería enviar la salida de ps -e al grep que muestra las líneas que contengan "kget", y se lo envía a un awk que muestra el ID.

Incluso para ponerse más "programador", podemos escribir un script que nos pida por parámetro un nombre, nos muestre los resultados posibles y nos pregunte cuáles queremos matar. Pero eso para más adelante...

Obviamente, cambiando kget por cualquier otra cadena de texto, va a buscar procesos cuyo nombre incluyan esa cadena. Hay que saber qué proceso queremos matar y cómo se llama.

¿Qué otra forma se les ocurre de hacer esto? Dejen su código en los comentarios a ver qué podemos hacer...

12 comentarios en este post

Feed de comentarios
  1. Avatar

    Imzyos 10 julio. 2008 - 18:31

    Es en momentos como este cuando digo WTF, tan sencillo que es el Ctrl + Alt + Supr, ya uso Linux pero ni idea de como sacar alguna gestor de procesos, además, en teoría no le necesito… dejando el offtopic la er andan metidas en todos lados, ¿algún buen tutorial para aprenderlas¿

  2. Avatar

    fernando 10 julio. 2008 - 19:46

    No hay que asustarse, obviamente hay maneras mas fáciles de hacer esto, como dice Bernabé por ejemplo. También con Ctrl+Esc, podemos abrir un administrador de procesos (en KDE por lo menos es con ese atajo). Pero, ¿qué tiene de divertido eso? :p

    Estoy por escribir algo más respecto a las expresiones regulares, así termino de asimilarlas, así que estate atento. Sino buscate por Google, no te sabría decir ninguno específico.

    Pablo: Podrías describir un poco cómo lo hiciste? (Aparte de RTFM, :d).

    Gracias por sus aportes.

  3. Avatar

    kbza 10 julio. 2008 - 20:22

    nosotros en el laburo tenemos un script para reiniciar un tomcat mañoso..

    y lo que hace es:

    ps aux | grep tomcat | grep -v grep | awk ‘{print $2}’ | xargs kill -9 ;

    luego un sleep, y luego un rctomcat5 start…
    pero esa parte no creo que importe 😉

  4. Avatar

    Pablo 11 julio. 2008 - 01:17

    Kbza,

    El codigo

    grep tomcat | grep -v grep

    es equivalente a

    grep tomca[t]

    o

    grep tomc[a]t

    o

    bueno, la idea es esa,

    la razon queda de ejercio 😉

  5. Avatar

    Halle 16 julio. 2008 - 18:38

    Buenas, yo tengo otro método, como para sumar a los aportes. Porque a veces no queremos “matar” todos los procesos que incluyan la cadena que buscamos.

    Yo uso ps -ef | grep kget

    Y me devuelve la lista de procesos que incluyen esa cadena. Busco la que me causa problemas y con sudo kill ‘id’ cierro el proceso.

    Son dos pasos en lugar de uno como lo planteas acá, y requiere saber que proceso es el problemático. Pero es más específico.

  6. Avatar

    Evelio 17 julio. 2008 - 19:51

    mi “forma” de matar procesos es parecida a la de Halle cuando no quiero matar todos los procesos solo uno en particular:

    pgrep nombre proceso

    y luego

    kill -9 id evuelto por pgrep

    pero cuando me siento como terminator y luego del rap de kill -9 (I run KILL DASH NINE,
    And your process is mine.) 😛 :

    kill -9 `pgrep nombre proceso`

    eso es una masacre 😀

  7. Avatar

    Wagner 22 agosto. 2008 - 19:19

    Estoy en la maquina del trabajo, pero en mi casa practicare este comando, ya que firefox de vez en cuando le gusta pasarse a la etapa frizamiento.

    Tambien pude entender aqui como era el significado de la variable $1, $2 y $n nunca sabia como era para localizarlo y pude comprenderlo bien aqui.

    Gracias por ese tip, man.

  1. Diapositivas: Introducción a redes {MontevideoLibre} | Picando Código | 13 julio. 2008 - 17:19

    […] Además de los conceptos de redes aprendimos que: OpenOffice.org + transiciones OpenGL + drivers privativos de video = explosión Por eso es que está bueno matar procesos! […]

  2. Genocidio de procesos con Expresiones Regulares | Picando Código | 7 diciembre. 2010 - 23:25

    […] scripting bash + awk, que hace tiempo no tenía la oportunidad de usar.  Más info al respecto en: Matando procesos con expresiones regulares. […]

  3. Renombrar varios archivos desde la línea de comando | Picando Código | 12 enero. 2011 - 18:42

    […] Matando procesos con expresiones regulares […]

Dejar un comentario

Toasty!