command-line – ¿Cuál es un buen ejemplo de canalización de comandos juntos?

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.

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım