2011-11-09 25 views
2

awkの初心者をファイルに印刷しないAWK:は、私はこれをしようとしている...ここ を

top -b -p 30259 | awk 'BEGIN { OFS = ","; print "Timestamp,CPU,Memory"} /tomcat/ { print strftime("%H:%M:%S"), $9, $10 }' > asdf.log 

しかし、 'asdf.log' は常に空のままです。スクリプト内からファイルにリダイレクトしようとしました:

top -b -p 30259 | awk 'BEGIN { OFS = ","; print "Timestamp,CPU,Memory" > "asdf.log"} /tomcat/ { print strftime("%H:%M:%S"), $9, $10 > "asdf.log" }' 

しかし、それでも動作しません。

私は間違っていますか?

+0

システムにpid '30259'のプロセスがありますか? – sarnold

+0

yes、without '>'はすべて正常です..私はコンソール上のデータを見ることができます – zorglub76

答えて

6

データが到着するのをどれくらい待っていますか?

プログラムで標準のCライブラリを使用してファイル(およびファミリのファミリ)に書き込むと、Cライブラリはパフォーマンスを向上させるためにバッファリングをストリームに追加します。 1人のキャラクターのすべての読み書きが実際にシステムコールを開始した場合、共通プログラムのパフォーマンスはかなり恐ろしいものになります。したがって、バッファが "十分に満杯"である場合、C標準入力ルーチンはブロックをIOに提出します。 、ファイルディスクリプタはファイルにあるならば、IOはブロックがをバッファリングしている -

トリッキーな部分は、Cの標準IOルーチンは、特定のファイルディスクリプタに基づいて「十分なフル」の彼らの定義を変更することを来りますある程度のデータが到着するのを待たなければなりません。ファイルディスクリプタは、それが端末を指しstdoutのためのものであり、場合(。最も可能性の高いサイズを確認するにはstat asdf.logIO Blockエントリをチェックしてください)。ただし、出力はラインバッファリングされている - 出力が端末に送信されます改行文字が印刷されるとすぐに削除されます。

おそらくsetvbuf(3) manページは私ができるよりも優れて説明することができます:

The three types of buffering available are unbuffered, block 
    buffered, and line buffered. When an output stream is 
    unbuffered, information appears on the destination file or 
    terminal as soon as written; when it is block buffered many 
    characters are saved up and written as a block; when it is 
    line buffered characters are saved up until a newline is 
    output or input is read from any stream attached to a 
    terminal device (typically stdin). The function fflush(3) 
    may be used to force the block out early. (See fclose(3).) 
    Normally all files are block buffered. When the first I/O 
    operation occurs on a file, malloc(3) is called, and a buffer 
    is obtained. If a stream refers to a terminal (as stdout 
    normally does) it is line buffered. The standard error 
    stream stderr is always unbuffered by default. 

は次のように見えるようにスクリプトを修正し:

top -b | awk 'BEGIN { OFS = ","; print "Timestamp,CPU,Memory"} 
/bash/ { print strftime("%H:%M:%S"), $9, $10; fflush() }' > /tmp/foo 

fflush()力出力すぐを。パフォーマンスはあまり良くありませんが、システムの状態をリアルタイムで表示するのに適しています。

関連する問題