Pregunta:
Si estuvieras ayudando a alguien a aprender el concepto de tuberías en la línea de comando, ¿qué ejemplo usarías? El ejemplo que realmente surgió fue el siguiente:
cat whatever.txt | less
Siento que ese no es el mejor ejemplo, es decir, porque solo hay un paso. ¿Cuál es un uso bueno, pero fundamental, de |
?
Idealmente, el ejemplo que presentaré utilizará programas que tengan salidas en sí mismas que puedan ejecutarse de forma independiente y luego mostrarse interconectadas.
Respuesta:
Les mostraré un ejemplo algo complejo, basado en un escenario de la vida real.
Problema
Digamos que el comando conky
dejó de responder en mi escritorio y quiero eliminarlo manualmente. Sé un poco de Unix, así que sé que lo que tengo que hacer es ejecutar el comando kill <PID>
. Para recuperar el PID, puedo usar ps
o top
o cualquier herramienta que me haya proporcionado mi distribución Unix. Pero, ¿cómo puedo hacer esto con un comando?
Respuesta
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
DESCARGO DE RESPONSABILIDAD: Este comando solo funciona en ciertos casos. No lo copie / pegue en su terminal y comience a usarlo, podría matar procesos sin sospechar nada. Más bien aprende a construirlo .
Cómo funciona
1- ps aux
Este comando generará la lista de procesos en ejecución y algo de información sobre ellos. La información interesante es que generará el PID de cada proceso en su segunda columna. Aquí hay un extracto de la salida del comando en mi caja:
$ ps aux
rahmu 1925 0.0 0.1 129328 6112 ? S 11:55 0:06 tint2
rahmu 1931 0.0 0.3 154992 12108 ? S 11:55 0:00 volumeicon
rahmu 1933 0.1 0.2 134716 9460 ? S 11:55 0:24 parcellite
rahmu 1940 0.0 0.0 30416 3008 ? S 11:55 0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
rahmu 1941 0.0 0.2 160336 8928 ? Ss 11:55 0:00 xfce4-power-manager
rahmu 1943 0.0 0.0 32792 1964 ? S 11:55 0:00 /usr/lib/xfconf/xfconfd
rahmu 1945 0.0 0.0 17584 1292 ? S 11:55 0:00 /usr/lib/gamin/gam_server
rahmu 1946 0.0 0.5 203016 19552 ? S 11:55 0:00 python /usr/bin/system-config-printer-applet
rahmu 1947 0.0 0.3 171840 12872 ? S 11:55 0:00 nm-applet --sm-disable
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:38 conky -q
2- grep conky
Solo estoy interesado en un proceso, así que uso grep
para encontrar la entrada correspondiente a mi programa conky
.
$ ps aux | grep conky
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
rahmu 3233 0.0 0.0 7592 840 pts/1 S+ 16:55 0:00 grep conky
3- grep -v grep
Como puede ver en el paso 2, el comando ps
genera el proceso grep conky
en su lista (después de todo, es un proceso en ejecución). Para filtrarlo, puedo ejecutar grep -v grep
. La opción -v
le dice a grep
que grep
coincidir todas las líneas excluyendo las que contienen el patrón.
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB: Me encantaría saber una forma de realizar los pasos 2 y 3 en una sola llamada grep
.
4- awk '{print $2}'
Ahora que he aislado mi proceso objetivo. Quiero recuperar su PID. En otras palabras, quiero recuperar la segunda palabra de la salida. Por suerte para mí, la mayoría (¿todos?) Unices modernos proporcionarán alguna versión de awk
, un lenguaje de programación que hace maravillas con los datos tabulares. Nuestra tarea se vuelve tan fácil como print $2
.
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
Tengo el PID. Todo lo que necesito es pasarlo para kill
. Para hacer esto, xargs
.
xargs kill
leerá de la entrada (en nuestro caso de la tubería), formará un comando que consiste en kill <items>
( <items>
son lo que sea que lea de la entrada), y luego ejecutará el comando creado. En nuestro caso ejecutará kill 1948
. Misión cumplida.
Ultimas palabras
Tenga en cuenta que, dependiendo de la versión de Unix que esté usando, ciertos programas pueden comportarse de manera un poco diferente (por ejemplo, ps
podría generar el PID en la columna $ 3). En caso de error o diferentes, lea la documentación del proveedor (o mejor, el man
páginas). También tenga cuidado ya que las tuberías largas pueden ser peligrosas. No hagas suposiciones, especialmente cuando uses comandos como kill
o rm
. Por ejemplo, si hubiera otro usuario llamado 'conky' (o 'Aconkyous'), ¡mi comando también podría matar todos sus procesos en ejecución!
Lo que digo es que tenga cuidado, especialmente con las tuberías largas. Siempre es mejor construirlo de forma interactiva como lo hicimos aquí, que hacer suposiciones y sentir pena más tarde.