for y awk en bash

Bash es muy potente y es una herramienta del día a día para muchos de nosotros. Hoy os traigo como automatizar la tarea de matar procesos en linux.

Si vemos los procesos de nuestra máquina podemos encontrar muchos procesos con el mismo nombre, en este ejemplo, el proceso konsole, y queremos matarlos a todos de golpe:

edu@Andromeda ~ # ps -ef
UID PID PPID C STIME TTY TIME CMD
edu 8849 8524 13 12:09 ? 00:00:41 /usr/lib/firefox/firefox
edu 8550 8524 0 12:06 ? 00:00:00 /usr/bin/ksmserver
edu 8559 8550 1 12:06 ? 00:00:09 /usr/bin/kwin_x11
edu 8563 8550 0 12:06 ? 00:00:01 /usr/bin/baloo_file
edu 9659 9346 5 12:15 pts/1 00:00:00 konsole
edu 9716 9346 6 12:15 pts/1 00:00:00 konsole
edu 9777 9346 7 12:16 pts/1 00:00:00 konsole

En este caso tenemos que tener en cuenta que además del archiconocido ps -ef para listar procesos podemos usar awk para ver una columna en concreto, en este caso la segunda columna, el PID.

# awk ‘{print $numero_de_columna}’

Y ahora podemos encadenar todo esto y usar un bucle para procesar todos, el bucle tendrá esta pinta

# for i in `condición`; do acción $i; done

Si combinamos estos tres elementos podemos decir se recorra la columna de PID de aquellos procesos que tengan la palabra konsole y que los mate, como en la foto que ilustra este post.

# for i in `ps -ef | grep konsole | awk ‘{print $2}’`; do kill -9 $i; done

Este es un comando genial que os dará la vida, porque matar proceso a proceso os va a destrozar la paciencia.

Enlaces: Programa de Ugeek dedicado a Screen

ACTUALIACIÓN: Otra manera para hacerlo sin el for sería con xargs, Gracias Laredoeneko que comentó en Ivoox:

# ps -ef | grep apache | awk ‘{print $2}’ | xargs kill -9