Как долго вы ожидаете поступления данных?
Когда программы используют стандартную библиотеку C для записи в файлы (fopen(3)
и семейство функций), библиотека C добавит некоторую буферизацию в потоки для повышения производительности.Если бы каждое чтение или запись одного символа фактически запускало системный вызов, производительность обычных программ была бы довольно ужасной.Таким образом, стандартные входные подпрограммы C будут отправлять блоков ввода-вывода, когда буферы "достаточно полны".
Сложные моменты, когда стандартные подпрограммы ввода-вывода C изменят свое определение "достаточно полно"«на основе конкретных файловых дескрипторов - если файловый дескриптор относится к file , то IO - это с буферизацией блока , и вы должны дождаться поступления определенного количества данных.(Проверьте stat asdf.log
'IO Block
запись, чтобы увидеть наиболее вероятный размер.) Однако, если дескриптор файла предназначен для stdout
и , это относится к терминальному устройству, вывод будет строка буферизованная - вывод будет отправлен на терминал, как только будет напечатан символ новой строки.
Возможно, справочная страница setvbuf(3)
может объяснить лучше, чем я:
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()
принудительно выводит немедленно .Не очень хорошо для производительности, но лучше для просмотра состояния вашей системы в режиме реального времени.