Desde o kernel Linux 2.6.35, você pode aumentar o tamanho de um pipe com o F_SETPIPE_SZ
fnctl (). Usuários não privilegiados estão limitados a valores entre 0 e o valor atual de fs.pipe-max-size
sysctl
(1MiB por padrão).
O valor que você usa deve ser maior que 64 KiB e ser uma potência de 2.
Então você poderia fazer:
perl -MFcntl -e 'fcntl(STDIN, 1031, 1048576) or die $!' <> /dev/xconsole
(aqui com F_SETPIPE_SZ codificado para o seu valor no meu sistema, pois o fcntl()
específico do Linux não está disponível para a minha versão do perl
).
Observe que fcntl()
não afeta /dev/xconsole
, mas o buffer de tubulação que foi instanciado quando /dev/xconsole
foi aberto (por syslog
e qualquer aplicativo que esteja lendo as mensagens na outra extremidade, então você ' d precisa fazê-lo em cada inicialização após o início do syslog).
Agora, se isso é o que você deveria fazer é outra questão. tubos são mecanismo de comunicação entre processos. Eles não são destinados a armazenar dados. Para entradas de syslog, 64 KiB deve ser mais que suficiente, pois suas ordens de magnitude são maiores do que sua entrada de registro típica.
Provavelmente, no seu caso, você tem um problema, pois a leitura do aplicativo de /dev/xconsole
não é iniciada com antecedência suficiente ou não está sendo lida rápido o suficiente.
Em qualquer caso, aconselho não alterar o tamanho do tubo padrão global.
Isso seria feito mudando:
#define PIPE_DEF_BUFFERS 16
(expresso em número de páginas 4KiB) para outra coisa em include/linux/pipe_fs_i.h
. Não é impossível que outras coisas precisem ser modificadas para refletir a mudança ou que essa mudança afetaria outras coisas de formas inesperadas.
Se você fizer um poder de 2 que seja > = 16, seria menos provável que ele quebrasse as coisas, mas cuidado, isso pode afetar significativamente o desempenho global do sistema e o comportamento do agendamento em particular.