Seit dem Linux-Kernel 2.6.35 können Sie mit F_SETPIPE_SZ
fnctl () die Größe einer Pipe erhöhen. Nicht privilegierte Benutzer sind auf Werte zwischen 0 und dem aktuellen Wert von fs.pipe-max-size
sysctl
(standardmäßig 1 MiB) beschränkt.
Der von Ihnen verwendete Wert sollte größer als 64 KiB sein und eine Potenz von 2 haben.
So könnten Sie tun:
perl -MFcntl -e 'fcntl(STDIN, 1031, 1048576) or die $!' <> /dev/xconsole
(hier mit F_SETPIPE_SZ fest auf seinen Wert auf meinem System codiert, da das Linux-spezifische fcntl()
für meine Version von nicht anderweitig verfügbar ist perl
).
Beachten Sie, dass fcntl()
dies /dev/xconsole
nur den Pipe-Puffer betrifft , der beim /dev/xconsole
Öffnen instanziiert wurde (von syslog
und unabhängig von der Anwendung, die die Nachrichten am anderen Ende liest, sodass Sie dies bei jedem Start nach dem Start von syslog tun müssen).
Nun, ob Sie das tun sollten, ist eine andere Sache. Pipes sind prozessübergreifende Kommunikationsmechanismen. Sie sollen keine Daten speichern . Für Syslog-Einträge sollten 64 KiB mehr als ausreichend sein, da sie um Größenordnungen größer sind als Ihr typischer Protokolleintrag.
In Ihrem Fall ist es wahrscheinlicher, dass Sie das Problem haben, dass das Lesen der Anwendung /dev/xconsole
nicht früh genug gestartet wird oder nicht schnell genug liest.
In jedem Fall würde ich davon abraten, die globale Standardrohrgröße zu ändern.
Das würde durch Ändern geschehen:
#define PIPE_DEF_BUFFERS 16
(ausgedrückt in 4 KiB-Seiten) zu etwas anderem in include/linux/pipe_fs_i.h
. Es ist nicht unmöglich, dass andere Dinge geändert werden müssen, um die Änderung widerzuspiegeln, oder dass diese Änderung andere Dinge auf unerwartete Weise beeinflusst.
Wenn Sie eine Potenz von 2 festlegen, die> = 16 ist, ist es weniger wahrscheinlich, dass Dinge kaputt gehen. Beachten Sie jedoch, dass dies die globale Systemleistung und insbesondere das Planungsverhalten erheblich beeinträchtigen kann.
/dev/xconsole
? Ich meine nicht die Pufferbegrenzungsgröße (dh 64 KB). Ich meine, wie viel von diesem Puffer gefüllt ist. Auf diese Weise könnte ich mich gleich zu Beginndd
leeren/dev/xconsole
, um die frühen Boot-Protokolle zu entfernen, an denen ich nicht interessiert bin.dd
können Siedd iflag=nonblock if=/dev/xconsole of=/dev/null
die Pipe leeren.perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &FIONREAD, $n) or die$!; print unpack "L", $n' <> /dev/xconsole