Cria um pipe nomeado / fifo que executa um comando quando lido

2

Estou procurando fornecer um processo que só leia de um arquivo local com conteúdo de um URL http. O processo é um daemon que é codificado para ler um arquivo específico em seu diretório de trabalho atual e o lê sempre que um evento específico acontece.

Eu não tenho controle sobre o evento que aciona o arquivo lido e quero fornecer dados quase em tempo real, em vez de constantemente descarregar dados por meio de um script curl para o arquivo.

O que eu pensei que poderia funcionar seria um fifo que executa um comando sempre que é lido. Isso seria então conectado ao netcat ou curl para recuperar o conteúdo da URL (dados xml). Isso é possível?

    
por Paul Allen 22.01.2015 / 00:37

1 resposta

3

É impossível fazer a leitura de um pipe iniciar um processo em um sistema de arquivos normal. Mas existem outros métodos que devem fazer o que você precisa.

Você pode executar o programa de geração de conteúdo em um loop. Cada vez que o FIFO é aberto para escrita, isso irá bloquear até que um leitor apareça.

while true; do
  generate-content >fifo
done

Outra abordagem é criar um sistema de arquivos FUSE que gere o conteúdo que você quiser - os dados retornados ao leitor são gerados pelo driver do sistema de arquivos, que é um programa comum, para que você possa fazer o que quiser. Construir um driver de sistema de arquivos FUSE é muito trabalhoso, então, a menos que você encontre um que já faça exatamente o que você precisa disso é provavelmente um exagero. Alguns sistemas de arquivos possíveis que podem ajudá-lo são:

  • ScriptFS - a julgar pela descrição, isso faz exatamente o que você precisa: “replica um sistema de arquivos local, mas substitui todos os arquivos detectados como 'scripts' pelo resultado de sua execução ”. Eu nunca usei isso.
  • HTTPFS - a leitura do arquivo aciona um download da web; conecte-o ao localhost e execute um pequeno servidor como lighttpd ou thttpd que suporta CGI ou um método semelhante para servir conteúdo dinâmico. Se os dados de que você precisa já tiverem sido baixados de um servidor da Web, simplesmente aponte HTTPFS para ele.
por 22.01.2015 / 00:56

Tags