Você poderia implementar um sistema de arquivos personalizado como um módulo do kernel ou usando o fusível. Dentro desse sistema de arquivos personalizado, você pode ter os arquivos virtuais que quiser.
Eu estou procurando por algo como um pipe nomeado persistente ... algo que eu possa cat ou grep várias vezes, e sempre obter o estado atual de qualquer processo que esteja alimentando o pipe.
Por exemplo, digamos que eu crie um canal nomeado chamado /tmp/timestamp
e use date
para escrever:
mkfifo /tmp/timestamp
date --iso-8601=seconds > /tmp/timestamp
Neste ponto, a chamada para date
será bloqueada, esperando que /tmp/timestamp
seja lido ...
cat '/tmp/timestamp'
Desbloqueia date
, vejo algo como 2017-03-18T16:11:54-04:00
gravado no stdout e date
terminará.
... mas e se eu quiser uma data atualizada toda vez que eu cat /tmp/timestamp
?
Eu acho que
while :; date --iso-8601=seconds > /tmp/timestamp; done
funcionará, mas eu gostaria de saber se a) existem problemas não óbvios com essa abordagem eb) se há uma maneira de fazer isso que não requer um loop.
Eu também gostaria de configurá-lo para que ele seja iniciado automaticamente, tornando o fifo sempre disponível.
Em termos de por que eu quero que isso esteja em pipes - as informações em questão são armazenadas em um banco de dados que suporta um aplicativo da web. A maioria dos nossos clientes de suporte técnico está totalmente confortável em fazer login nos servidores via ssh e executando consultas no banco de dados, mas existem algumas estatísticas vitais que seriam realmente úteis para simplesmente buscar arquivos. Ser capaz de ls
do diretório que contém os pipes nomeados tornaria tudo isso descoberto ... essencialmente, não estou fazendo isso porque tenho que fazer isso, porque é uma metáfora que acho que funcionará bem.
Você poderia implementar um sistema de arquivos personalizado como um módulo do kernel ou usando o fusível. Dentro desse sistema de arquivos personalizado, você pode ter os arquivos virtuais que quiser.
Aqui está um "problema não óbvio" com o loop: se um processo de leitura mantém o fifo aberto (porque, digamos, bloqueia a abertura de outro arquivo ou é suspenso), o loop de gravação será executado continuamente (até preencher o buffer fifo). Há também problemas com vários leitores concorrentes, mas talvez você possa eliminar essa possibilidade de maneira razoável.
Como para uma solução não-loop, você pode usar um soquete em vez de um fifo, mas então você tem que escrever um programa leitor (trivial) (e usar pipes se você quiser executar algo diferente de cat
) desde você não pode apenas open
aqueles.
Tags fifo