Wireshark-users: Re: [Wireshark-users] tshark output
From: Guy Harris <guy@xxxxxxxxxxxx>
Date: Mon, 23 Mar 2009 22:36:33 -0700

On Mar 23, 2009, at 9:01 PM, Chris Henderson wrote:

Tried: tshark -i eth0 -n port 68 -R 'bootp.type == 2' -o
column.format:'"Source MAC","%hs"' > /tmp/capture &

but get nothing in the file.

How long did you let it run?

ps -ef | grep shark shows tshark -i eth0
-n port 68 -R bootp.type == 2 -o column.format:"Source MAC","%hs"

pkill shark - and I get the /tmp/capture file with all the entries!

What signal does pkill send?

If it sends SIGTERM, for example, then:

1) tshark, like a lot of other programs, uses the "standard I/O" routines (printf/fprintf, fputs, etc.) to write to the standard output;

2) the standard I/O routines are, by default, block-buffered, which means that, if the buffer size is N bytes (N will probably be somewhere between 4K and 8K bytes), nothing will be written to the file until N bytes worth of output have been generated by those routines;

3) if you terminate the process gracefully (i.e., with a signal that it captures, such as SIGTERM), it will write out any buffered information before exiting.

If you're just writing to a file, and have no reason to read from the file until the program finishes, the right thing to do is not to read from the file until the program finishes.

If you have some reason to read from the file before the program finishes, what is the reason? The best way to handle that might be different for different reasons. For example, if you pass tshark the "-l" flag, it'll write out buffered information after each packet arrives; that might be what you want, but it might also mean more writes to the file than you want (the more stuff written per write, and thus the fewer writes for the same amount of data written, the lower the overhead).