Existe uma maneira de implementar arquivos personalizados que funcionam como os 'arquivos' no sistema de arquivos / proc?

6

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.

    
por Barton Chittenden 18.03.2017 / 21:55

2 respostas

2

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.

    
por 11.04.2018 / 07:09
2

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.

    
por 20.09.2017 / 06:27

Tags