2013-02-20 36 views
2

我正在使用命名管道來捕獲系統日誌消息。然後,我可以通過做類似FIFO要grep到文件

cat /var/log/local3.pipe | grep somefilter 
or 
grep somefilter /var/log/local3.pipe 

很容易地查看系統日誌。這些都將syslogs輸出到控制檯非常好。但是,如果我再要拍攝到一個文件中我什麼也沒得到,如

cat /var/log/local3.pipe | grep somefilter >> somefile.log 
or 
grep somefilter /var/log/local3.pipe >> somefile.log 

文件始終保持爲零字節。有誰知道爲什麼?我正在使用紅帽企業Linux 5.謝謝。

附加信息:對於任何人誰願意在這裏重現此的命令的完整列表

su 
<enter root password> 
mkfifo /var/log/local3.pipe 
chmod 644 /var/log/local3.pipe 
echo "local3.* |/var/log/local3.pipe" >> /etc/syslog.conf 
/etc/init.d/syslog restart 
exit 

然後用一個SSH會話:

cat /var/log/local3.pipe 

,並在第二個SSH會話(「測試一下「應顯示在第一個ssh會話

logger -p local3.info "Test it" 

然後在第一個會話中將其更改爲

cat /var/log/local3.pipe >> somefile.log 

發送一些更多的日誌到本地3(消息需要不同)。確認消息進入somefile.log

logger -p local3.info "Test it 2" 

然後在第一個環節改變它

cat /var/log/local3.pipe | grep -i test >> somefile.log 

現在確認日誌不會somefile.log

注意消息需要與上一條消息不同,否則記錄器不會立即發送。

+0

您是第一次執行'grep somefilter/var/log/local3.pipe',然後是'grep somefilter /var/log/local3.pipe >> somefile.log'?因爲那時管道的內容已經消耗完了。 – Cairnarvon 2013-02-20 00:36:19

+0

嗨Cairnarvon。在執行第二個命令之前,我總是終止第一個命令。我可以在這兩個命令之間來回切換,第一個始終工作,第二個總是產生一個零字節的文件。如果我做cat /var/log/local3.pipe >> somefile.log,那就行了。看起來,將grep放入混合文件(以及管道到文件)會使事情停止。 – MikeKulls 2013-02-20 00:53:51

回答

2

我可以重現你的問題,而這種修復它爲我:

cat /var/log/local3.pipe | grep -i --line-buffered test >> somefile.log 

我想原因是,當標準輸出是指終端(根據isatty(3)),則使用行緩衝,但只要你重定向到一個文件,libc就會切換到正常的固定大小緩衝。因此,在grep進程的標準輸出緩衝區被填充之前,您必須檢查somefile.log,因此在它有任何理由寫入文件之前。

迫使線緩衝的另一種方法是如下:

cat /var/log/local3.pipe | stdbuf -oL grep -i test >> somefile.log 

您可以在這兩個偉大的文章閱讀更多關於這一切:

(我很高興地注意到stdbuf是由一個人寫的,他今天給我發了一封完全不同的信息 - 小世界!)