В Linux tcsh, если я создаю файл журнала, например:

CMD > cmd.log

Как я могу сделать буфер записи, который кэширует данные перед отправкой на диск, больше, чем по умолчанию? Как я могу буферизовать больше данных записи, идущих в cmd.log и уменьшить частоту записи в этот дескриптор файла?

РЕДАКТИРОВАТЬ: Я до сих пор не понял, как это сделать, но мы нашли проблему с нашей системой. Кто-то избивал файловый файлер NFS множественной записью одних и тех же данных. Они даже не использовали локальные диски для постепенного генерирования файла и последующего копирования результатов в NFS.

Также вы можете использовать

CMD_BLAH | gzip --stdout > log.gz

Который будет выполнять некоторое кэширование в основной памяти, а также уменьшать конечный размер выходного файла (обычно).

2 ответа2

3

Вы можете использовать ' pv ', чтобы 'задушить' то, что пропускается.

-B BYTES, --buffer-size BYTES
   Use a transfer buffer size of BYTES bytes. A suffix of 
   "k", "m", "g", or "t" can be added to denote kilobytes (*1024),
   megabytes, and so on. The default buffer size is the block
   size of the input file's filesystem multiplied by 32 (512kb max),
   or 400kb if the block size cannot be determined.

Применительно к вашему примеру это будет выглядеть так:

% CMD | pv -B 1m > cmd.log
0

Вы можете попробовать настроить именованный канал (man mkfifo). Запишите вывод вашей команды в именованный канал. Настройте другой процесс для периодического чтения. Это не изменит буферы чтения / записи, но будет контролировать поток данных, сбрасываемых на диск, на основе заданного вами интервала времени. Если вы хотите контролировать размер буфера записи, вы можете написать простую программу на C, которая использует setvbuf.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .