2014-01-13 68 views
18

我有一個程序(服務器),我正在尋找一種方式(腳本),將重定向(或更好地複製)其所有stdout文件併爲每個條目添加時間戳。我已經做了一些研究,最遠的地方是得到How to add timestamp to STDERR redirection。它重定向stdout倒是時間戳的時候腳本完成:Bash - 如何添加時間戳,同時重定向stdout文件

代碼
#!/bin/bash 
./server | ./predate.sh > log.txt 

predate.sh

#!/bin/bash 
while read line ; do 
    echo "$(date): ${line}" 
done 

我是一個Linux初學者,我顯然失去了一些東西很重要,因爲它似乎服務器輸出在程序退出後被刷新(不重定向就可以正常工作)。另外,如果我嘗試使用predate.sh對提到的線程給出的例子,它完美的作品。我知道將時間戳添加到主程序很容易,但我寧願避免編輯它的代碼。

編輯:唯一的工作答案都在評論

+2

所以問題是,所有的時間戳是相同的,當腳本結束的時候?聽起來像這是'服務器'輸出沒有正確緩衝的問題。 http://stackoverflow.com/questions/3465619/how-to-make-output-of-any-shell-command-unbuffered可能是你在找什麼 – Graeme

+0

輸出到_awk_。它提供了一個叫做_strftime_的函數。 – devnull

+1

'expect'發行版帶有一個名爲['unbuffer']的程序(http://linuxcommand.org/man_pages/unbuffer1.html):'unbuffer ./server | ./predate.sh> log.txt' –

回答

-1

如果我理解你的問題是已經包含在你的log.txt文件stderr輸出。對 ? 如果這就是你想要的解決方案是:

./server 2> & 1 | ./predate.sh> log.txt的

問候

+2

nope,它只是時間都是一樣的 – wondra

+0

也許你的服務器執行得太快......嘗試打印納秒如下並檢查差異:echo「$(date +%T.%N):$ {line} 「 – HelpBox

+0

我有關閉服務器的功能,需要25秒,相信我 - 我會注意到... – wondra

4

你對我的代碼工作完全正常

入住這就是我試圖

test.sh

#!/bin/bash 

while true; do 
    echo "hello" 
done 

predate.sh

#!/bin/bash 

while read line; do 
    echo $(date) ":" $line;  
done 

然後

./test.sh | ./predate.sh 

給我

Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 
Tue Jan 14 17:49:47 IST 2014 : hello 

這可以被重定向到使用一些文件 「>」 或 「>>」 進行追加

Check Snapshot

+1

如果您仔細閱讀我的問題 - 這有效。腳本標準輸出給我,但程序標準沒有(奇怪)。我需要程序的標準輸出。這個問題比較複雜,然後簡單地重定向輸出 - 程序輸出結束後立即被激活。 – wondra

+0

格式化丟失:我努力得到正確的格式,並以此函數結束(function preate(){tr「\ n」「\ 0」| xargs -0 -I {} echo「$(date):{}」; }(注意這仍然不能回答這個問題)。 –

34

我最近需要準確即:在串行控制檯(picocom)中接收日誌消息,將它們打印到終端和文件並預先輸入日期。

我現在使用看起來s.th.像這樣:

picocom -b 115200 /dev/tty.usbserial-1a122C | awk '{ print strftime("%s: "), $0; fflush(); }' | tee serial.txt 
  • picocom輸出被管道輸送到awk
  • awk預先考慮日期(%s選項轉換自1970-01-01 00:00的時間的秒數量: 00 UTC - 或使用%c爲人類可讀的格式)
  • fflush()flushes any buffered outputawk
  • 管道到tee將其轉移到文件。 (你可以找到一些東西約teehere
+8

非常感謝您的支持。我想向使用此功能的任何人添加打印類似「2015-11-13 17:04:57:」的時間戳,格式爲「%Y-%m-%d%H:%M:%S: 」。 – lm2s

+1

Awk,永遠的救援。 – macetw

+1

這是我唯一的輸出:'awk:line 2:函數strftime永遠不會定義# – ygoe

-2

我運行一個cron作業是這樣的:

0 * * * * user /home/user/script.sh >>stdout.log 

然後在script.sh,我有這樣的事情:

#!/bin/bash 
date 
do_some_code 

由於「date」是我的script.sh的stdout的一部分,所以timestamp是每個stdout.log條目中的第一行。

+2

這是最恰當的切線,並沒有回答這個問題。如果你有一個長期運行的工作,你經常想看看什麼時候打印了一條特定的消息。 – tripleee

+0

如果您從腳本/程序重定向,則無法更改。 – srigi

-1

我在使用上面的例子: picocom -b 115200 /dev/tty.usbserial-1a122C | awk'{print strftime(「%s:」),$ 0; fflush(); }'| tee serial.txt

轉儲/重定向日誌文件中的telnet輸出數據,但我無法在後臺運行我的腳本。如果我使用'&'來運行它的背景,那麼它不起作用。

要點#1:沒有'&'的工作命令: script:dumpper.sh telnet $ 1 $ 2 | awk'{print strftime(「%s:」),$ 0;}'| tee $ host。$ port.log;

命令:./dumpper.sh 16.1.1.8 202

點#1:不工作的命令與 '&': 腳本:dumpper.sh 的telnet $ 1 $ 2 | awk'{print strftime(「%s:」),$ 0;}'| tee $ host。$ port.log 2> & 1;

命令:./dumpper.sh 16.1.1.8 20224 &

+0

請解釋我如何在後臺運行telnet並在日誌文件中記錄telnet輸出。我不想打擾telnet提示。 – vicky