É possível fazer com que as operações seek () em um pipe nomeado retornem com sucesso?

11

Existe alguma maneira de fazer com que quando os programas tentam executar seek() operações em um pipe nomeado ele retornará com sucesso (mas aja como se o pipe fosse um arquivo vazio) ao invés de 'Illegal seek'? / p>

Eu tenho o último log de meu sistema armazenado em um banco de dados SQLite, eu não tenho arquivos em qualquer lugar. No entanto, existem alguns programas que têm problemas com isso. Existem 2 casos específicos;

  • Um programa deseja gravar em um arquivo de log que o syslog-ng criou como um pipe nomeado e está lendo. O programa quer executar um seek() por algum motivo e depois falha.
  • Um programa (como denyhosts ou fail2ban) deseja ler de um arquivo de log que o syslog-ng criou como um pipe nomeado e está gravando nele. O programa quer executar um seek() e falhar.

Idealmente, gostaria que eles procurassem se comportar como se o pipe nomeado fosse apenas um arquivo vazio. Não vejo nenhum motivo pelo qual um programa que escreve um log precise executar uma pesquisa de qualquer maneira, basta abrir o arquivo para acrescentar e começar a escrever. Eu posso ver por que uma leitura de programa iria querer procurar, para que ela pudesse retornar da sua última posição, e então eu gostaria que ela se comportasse como se o arquivo estivesse vazio (como se tivesse sido truncado).

Então, há alguma opção que pode ser definida em pipes nomeados para fazer com que eles se comportem dessa maneira? Se não há um modo que pode ser definido quando o syslog-ng abre o canal para que ele se comporte dessa maneira (estou aberto para fazer alterações no código)? Ou eu sou um riacho?

    
por Patrick 05.02.2012 / 00:12

2 respostas

9

Tubos de busca foram propostos para o kernel do Linux, mas não tenho conhecimento de um patch de trabalho para implementá-los.

Você pode usar uma biblioteca LD_PRELOAD que substitua a chamada lseek em específico arquivos. Eu não sei de nenhum invólucro pronto para uso para essa finalidade. Shadowfs pode ajudar a escrever um.

    
por 05.02.2012 / 01:13
1

Se o aplicativo estiver chamando seek, ele será quebrado ou não funcionará em pipes. Se o primeiro, então precisa ser corrigido. Se este último, então, espera que a busca realmente funcione, então mentir e alegar que funcionou quando não funcionaria, certamente causaria uma operação incorreta.

Além disso, se o arquivo de log for substituído por um canal nomeado, somente um processo poderá ser lido por ele de cada vez. Deve ser uma tomada em vez disso.

    
por 05.02.2012 / 23:14

Tags