pipelinux

Los sistemas Linux admiten tuberías que permiten pasar la salida de un comando a otro, pero también admiten "tuberías con nombre", que son bastante diferentes.

La mayoría de las personas que pasan tiempo en la línea de comandos de Linux se mueven rápidamente en el uso de tuberías. De hecho, las tuberías fueron una de las cosas que realmente me entusiasmaron cuando usé por primera vez la línea de comandos en un sistema Unix. Mi aprecio por su poder y conveniencia continúa incluso después de décadas de usar Linux. Usando tuberías, descubrí todo lo que podía hacer enviando la salida de un comando a otro comando, y a veces a un comando después de ese, para adaptar aún más la salida que estaba buscando.

Los comandos que incorporan tuberías - como el que se muestra a continuación - me permitieron extraer sólo la información que necesitaba sin tener que compilar un programa o preparar un script.

$ cat myposts | grep Linux | wc -l
1456

El comando anterior enviaría el contenido de un archivo llamado "myposts" a un comando grep buscando la palabra "Linux" y luego enviaría esa salida a un comando wc para contar el número de líneas en la salida.

Como probablemente sospeches, las tuberías se llaman "pipes" en gran parte por su parecido con la función de los conductos. Puede que las veas referidas como "tuberías sin nombre" o "tuberías anónimas" porque no son el único tipo de tuberías que Linux proporciona. Hablaremos de ello en breve.

De hecho, las tuberías son tan útiles que a menudo convierto algunos de los comandos que las incorporan en alias para facilitar aún más su ejecución. Por ejemplo, el comando que se muestra a continuación que enumera todos los procesos asociados con la cuenta de inicio de sesión actual podría añadirse al archivo .bashrc del usuario con una línea como esta:

$ echo 'alias myprocs="ps -ef | grep `whoami`"' >> ~/.bashrc
$ tail -1 ~/.bashrc
alias myprocs="ps -ef | grep `whoami`"

Una vez que hayas enviado tu archivo .bashrc a , el alias estará listo para usarse.

$ myprocs
root        3219     738  0 12:15 ?        00:00:00 sshd: shs [priv]
shs         3229       1  4 12:15 ?        00:00:00 /usr/lib/systemd/systemd --user
shs         3245    3229  0 12:15 ?        00:00:00 (sd-pam)
shs         3269    3219  0 12:15 ?        00:00:00 sshd: shs@pts/0
shs         3284    3269  0 12:15 pts/0    00:00:00 -bash
shs         3319    3284  0 12:15 pts/0    00:00:00 ps -ef
shs         3320    3284  0 12:15 pts/0    00:00:00 grep --color=auto shs

Para ver sólo los IDs de los procesos, puedes configurar un alias como éste:

$ alias myps=”ps aux | grep ^`whoami` | awk '{print \$2}'”

Tenga en cuenta que sólo busca el nombre de usuario en el primer campo (indicado por el ^ para marcar el comienzo de las líneas y muestra el segundo campo. El \ asegura que $2 no se interpreta hasta que el alias es el uso.

Las tuberías que se utilizan para establecer un flujo de datos que permite a los comandos pasar su salida a otros comandos no es, sin embargo, el único tipo de tubería disponible en los sistemas Linux. En los sistemas Linux, en realidad hay dos formas bastante diferentes de tuberías - las que se muestran arriba y otra forma de tuberías que se llaman "tuberías con nombre".

Tuberías con nombre

A diferencia de las tuberías sin nombre, las tuberías con nombre son bastante diferentes, ya que pueden enviar datos en cualquier dirección. Los comandos pueden enviar datos a las tuberías con nombre y los comandos pueden leer ese contenido. Además, el contenido de las tuberías con nombre no reside en el sistema de archivos, sino sólo en la memoria virtual.

Permiten que los procesos se comuniquen entre sí. Se configuran como archivos especiales en el sistema de archivos (indicado por el primer carácter en un listado largo que es una "p". Otros permisos indican quién puede leer o escribir en la tubería.

He aquí un ejemplo de creación de una tubería con nombre con el comando mkfifo:

$ mkfifo mypipe
$ ls -l mypipe
prw-r--r--. 1 justme justme 0 Aug  8 13:55 mypipe

Observe la "p" inicial en el listado mostrado arriba que indica que el archivo es una tubería con nombre y el 0 (5º campo) que muestra que no tiene contenido.

Usando el argumento -m, puede establecer permisos para permitir que otros usuarios escriban en las tuberías. Tenga en cuenta que por defecto el propietario puede leer y escribir y los demás sólo pueden leer. He aquí un ejemplo:

$ mkfifo -m 666 sharedpipe
$ ls -l mypipe0
prw-rw-rw-. 1 shs shs 0 Aug  7 12:50 sharedpipe

Incluso cuando se envían datos a una tubería con nombre, ésta aparece vacía.

$ echo “Here comes some content” > mypipe
$ ls -l mypipe
prw-r--r--. 1 justme justme 0 Aug   13:57 mypipe

Otro proceso podría leer el contenido con un comando como este:

$ cat mypipe
Here comes some content

Si ejecutamos el comando que envía los datos a la tubería en segundo plano, podemos leerlos con un comando cat. Observa que el archivo sigue apareciendo vacío en el listado de archivos, pero podemos recuperar el texto sólo una vez con un comando cat. Una vez recuperado, desaparece.

Sin embargo, nada nos impide enviar más datos a la tubería, siempre y cuando siga existiendo.

$ echo "Here comes some content" > mypipe &
[1] 1593
$ ls -l mypipe
prw-r--r--. 1 fedora fedora 0 Aug  5 13:55 mypipe
$ cat mypipe
Here comes some content
[1]+  Done                    echo "Here comes some content" > mypipe
$ cat mypipe
^C

Resumen

Las tuberías con nombre son más complejas que las tuberías sin nombre y se utilizan con mucha menos frecuencia, pero desempeñan un papel interesante en los sistemas Linux.

 

Fuente: somoslibres

 

¿Quién está en línea?

Hay 53948 invitados y ningún miembro en línea