Usando PIPEs no Linux: mknod p, mkfifo

Como é o primeiro POST de 2009, começo desejando a todos um ano de muito sucesso!

Hoje vou exemplificar a utilização de um tipo de arquivo chamado PIPE para compactação de arquivos.

Pipe significa cano, tubo, duto, dependendo do contexto. Nesse caso podemos encará-lo como um inode de entrada e saída (FIFO – first in first out/primeiro que entra, é o primeiro que sai).

Nada mais é que um arquivo em disco programado pra receber algo de STDIN e jogar esse algo em STDOUT (input and output/entrada e saida).

Logo, podemos interceptar o funcionamento desse pipe e pegar tudo que ele jogar em STDOUT, compactar com gzip e jogar a saída para um arquivo com extensão .gz…

Mãos à obra:

Para criar esse tipo de arquivo no Linux conheço duas formas: mkfifo e mknod (conforme abaixo).

root@srv:/tmp/teste# mknod pipegzip p
root@srv:/tmp/teste# ls -la pipegzip
prw-r–r– 1 root root 0 2009-01-08 18:16 pipegzip
root@srv:/tmp/teste# mkfifo pipegzip2
root@srv:/tmp/teste# ls -la pipegzip2
prw-r–r– 1 root root 0 2009-01-08 18:16 pipegzip2
root@srv:/tmp/teste#

Com o arquivo criado, podemos começar a utilizá-lo.

root@srv:/tmp/teste# cat pipegzip | gzip -c > gezipado.gz &
[1] 6395
root@suporte5505:/tmp/teste# ls -la
total 8
drwxr-xr-x 2 root root 4096 2009-01-09 11:48 .
drwxrwxrwt 22 root root 4096 2009-01-09 11:44 ..
-rw-r–r– 1 root root 0 2009-01-09 11:48 gezipado.gz
prw-r–r– 1 root root 0 2009-01-09 11:45 pipegzip

Perceba que nesse momento o arquivo gezipado.gz já foi criado e está com tamanho zero. Agora podemos criar um arquivo txt qualquer e jogar o conteúdo dele pra cima do pipe que criamos anteriormente..

root@suporte5505:/tmp/teste# echo “texto qualquer” > texto.txt
root@suporte5505:/tmp/teste# ls -la texto.txt
-rw-r–r– 1 root root 15 2009-01-09 11:52 texto.txt
root@suporte5505:/tmp/teste# cat texto.txt > pipegzip
root@suporte5505:/tmp/teste#
[1]- Killed cat pipegzip | gzip -c > arquivo_compactado.gz
[2]+ Done cat pipegzip | gzip -c > gezipado.gz

Neste momento o comando cat compactando terminou pois já fez a função dele…
Repare agora que o tamanho do arquivo gezipado.gz foi para 35 (tamanho do nosso texto compactado):

root@suporte5505:/tmp/teste# ls -la
total 16
drwxr-xr-x 2 root root 4096 2009-01-09 11:52 .
drwxrwxrwt 22 root root 4096 2009-01-09 11:44 ..
-rw-r–r– 1 root root 35 2009-01-09 11:53 gezipado.gz
prw-r–r– 1 root root 0 2009-01-09 11:53 pipegzip
-rw-r–r– 1 root root 15 2009-01-09 11:52 texto.txt

Agora podemos remover o texto.txt e descompactar o arquivo gezipado.gz normalmente, ele vai estar lá:

root@suporte5505:/tmp/teste# rm texto.txt
root@suporte5505:/tmp/teste# gunzip gezipado.gz
root@suporte5505:/tmp/teste# cat gezipado
texto qualquer
root@suporte5505:/tmp/teste#

Logico que neste caso o tamanho do arquivo compactado ficou maior que o descompactado pois um arquivo de 15 bytes compactado fica mais complexo do que ele simples e descompactado…

Mas tratando de arquivos maiores (um backup de um banco de dados de 600gb por exemplo), esse tipo de aplicação de pipe ajuda a economizar espaço em disco durante a geração do backup.

Por exemplo, se você tem um banco de dados de 300gb ocupado em disco e tem que fazer o backup dele em uma partição que tem apenas 50gb sobrando. Você sabe que esses 300gb do banco, compactando ficam 40gb, mas você não vai conseguir gerar os 300gb pra depois compactar pois só tem 50gb… Então mande o aplicativo de backup gerar o backup de 300gb em cima do pipe e programe um “cat | gzip >> arquivo_do_banco.gz” que os 40gb vão caber dentro do 50gb 😉

Outro exemplo interessante do uso de pipes, mas nada haver com compactação é:

* Tunel criptografado SSH para executar comandos em máquinas remotas com pipe. (continue lendo o blog pois este assunto será abordado em futuro post dedicado).

Por: Hudson Murilo dos Santos

Fonte de pesquisa:
http://yong321.freeshell.org/oranotes/ImpExpThruPipe.txt
http://groups.google.com/group/comp.unix.shell/browse_frm/thread/9e00c16a4a61219d?pli=1

2 thoughts on “Usando PIPEs no Linux: mknod p, mkfifo

Leave a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *