Jue
10
Jul

Matando procesos con Expresiones Regulares


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…


Si te gustó éste post, podés apoyar a PicandoCódigo a través de PayPal!

10 Comentarios para “Matando procesos con Expresiones Regulares”

  1. Bernabé García a las 3:18 pm 10 Julio. 2008
    Konqueror 3.5GNU/Linux
    Mozilla/5.0 (compatible; Konqueror/3.5; Linux 2.6.24.5-desktop-1mnb; X11; es, en_US) KHTML/3.5.9 (like Gecko)

    También podrías utilizar killall kget

  2. Imzyos a las 6:31 pm 10 Julio. 2008
    Firefox 3.0Windows XP
    Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9) Gecko/2008052906 Firefox/3.0

    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¿

  3. Pablo a las 7:30 pm 10 Julio. 2008
    Firefox 2.0.0.14GNU/Linux
    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14

    Sutil:

    ps -e | grep kge[t] | awk ‘{print $1}’ | xargs kill -9

  4. fernando a las 7:46 pm 10 Julio. 2008
    Debian IceWeasel 3.0Debian GNU/Linux
    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008062113 Iceweasel/3.0 (Debian-3.0~rc2-2)

    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.

  5. kbza a las 8:22 pm 10 Julio. 2008
    Unknown Unknown O.S.
    undefined GoogleToolbarBB

    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 ;)

  6. Pablo a las 1:17 am 11 Julio. 2008
    Firefox 3.0Windows XP
    Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9) Gecko/2008052906 Firefox/3.0

    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 ;)

  7. Halle a las 6:38 pm 16 Julio. 2008
    Firefox 3.0.1GNU/Linux
    Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.0.1) Gecko/2008070206 Firefox/3.0.1

    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.

  8. Evelio a las 7:51 pm 17 Julio. 2008
    Firefox 3.0GNU/Linux
    Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9) Gecko/2008062517 Firefox/3.0

    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.) :P :

    kill -9 `pgrep nombre proceso`

    eso es una masacre :D

  9. Wagner a las 7:19 pm 22 Agosto. 2008
    Firefox 3.0.1Windows XP
    Mozilla/5.0 (Windows; U; Windows NT 5.1; es-AR; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1

    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.

Trackbacks y pingbacks:

  1. [...] 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! [...]

Dejar un comentario

Al agregar un comentario en esta página, usted acepta la siguiente licencia para su publicación:
Creative Commons License Creative Commons Attribution-Share Alike 3.0 Unported License.




Si quieres mostrar código, enciérralo entre los tags pre de esta forma:
<pre lang="L"> y </pre>, donde L es un lenguaje compatible GeSHI. Más info.

XHTML: Las siguientes tags están permitidas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">


Additional comments powered by BackType

Búsqueda personalizada