awk не печатает в файл - PullRequest
       6

awk не печатает в файл

3 голосов
/ 09 ноября 2011

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" }'

но все равно не работает ... А печать на стандартный вывод работает нормально.

Что я делаю не так?

1 Ответ

8 голосов
/ 09 ноября 2011

Как долго вы ожидаете поступления данных?

Когда программы используют стандартную библиотеку 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() принудительно выводит немедленно .Не очень хорошо для производительности, но лучше для просмотра состояния вашей системы в режиме реального времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...