LINUX.ORG.RU

Как узнать размер открытого и дозаписываемого файла?

 ,


0

1

Добрый день!

Если файл открыт на запись, то ни ls, ни lsof не показывают его изменившийся размер, а показывают старый. Новый размер показывается только когда файл будет закрыт.

Как можно посмотреть размер файла «онлайн»?


Ответ на: комментарий от anonymous

Да, только он у меня почему-то и после закрытия старый размер показывает. Вот тестовая программка. Изменяешь файл по одному символу - и изменений не видно.

#include <iostream> #include <sstream> #include <stdio.h> #include <stdlib.h> #include <string.h>

#include <fstream>

#include <sys/time.h> #include <sys/types.h> #include <unistd.h>

using namespace std;

int main(int argc, char *argv[]) {

fstream tfile; tfile.open(«test0»); char c;

while(true) { cin>>c; if (c !='q') tfile<<c; else break; }

tfile.close(); cout<<«finished»<<endl; return 0; }

antp
() автор топика
Ответ на: комментарий от antp

Да, только он у меня почему-то и после закрытия старый размер показывает

Это я в килобайтах выводил, а если du -b, то меняется, конечно, но только после закрытия файла. Проблему не решает.

antp
() автор топика
Ответ на: комментарий от i-rinat

Спасибо, попробую.

Только проблема немного в другом. Есть промышленный комп. На нем нет жесткого диска - нельзя из-за вибрации. А есть одна флешь память с ограниченным ресурсом записи. И есть ПО различных фирм, которые пишут свои логи и порой непонятно куда и чего они пишут. Вот я и хочу проконтролировать извне сколько и чего пишется на эту несчастную флешку.

А можно ли как-то заставить записать буферы не из программы, а командой какой-то из оболочки?

antp
() автор топика
Ответ на: комментарий от WRG

Судя по описанию - это то, что нужно, но у меня не работает. На данный момент у меня нет физического устройства, поэтому тестирую на вот этом https://hosting.reg.ru/vps/plan/VPS-1-1011 и на локальной виртуалке. На VPS стоит centos, а на локальной - opensuse. Везде результат один - пока файл не закроешь - изменения не увидишь.

antp
() автор топика
Ответ на: комментарий от imb

Дело в том, что я не могу программистов заставить так делать и не знаю априори делают ли они так. Поэтому я и придумал этот простой пример - вот просто пишу в файл, как посмотреть этот измененный размер.

antp
() автор топика
Ответ на: комментарий от antp

А можно ли как-то заставить записать буферы не из программы, а командой какой-то из оболочки?

Нет. fstream копит данные внутри себя, не производя системный вызов write. У операционной системы нет никакой возможности гарантированно знать, копит ли программа данные, или данных просто нет.

Вот я и хочу проконтролировать извне сколько и чего пишется на эту несчастную флешку.

Похоже, тебе поможет http://linux.die.net/man/8/blktrace

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

При запуске blktrace -d /dev/sda выходит ошибка BLKTRACESETUP: Inappropriate ioctl for device Failed to start trace on /dev/sda.

Что за беда? Может быть он на виртуалке не работает?

antp
() автор топика

Если файл открыт на запись, то ни ls, ни lsof не показывают его изменившийся размер, а показывают старый. Новый размер показывается только когда файл будет закрыт.

Нет, ты ошибся.

Deleted
()
Ответ на: комментарий от antp

Вот я и хочу проконтролировать извне сколько и чего пишется на эту несчастную флешку.

Посмотри в сторону auditd. Или inotify.

Deleted
()

Понимаешь, стандартная библиотека имеет ещё и внутренний механизм буферизации. Если программа делает printf или cout<<, то не факт, что стандартная библиотека прямо сразу будет выводить данные. Соответственно, ты не сможешь узнать, сколько всего записывается прямо вот сейчас, потому что не заставишь запущенную чужую программу сбросить свои внутренние буферы.

tiandrey ★★★★★
()
Ответ на: комментарий от tiandrey

А если записать сразу несколько гигабайт? Неужели будет отображаться старый размер, пока запись не завершится и файл не будет закрыт?

WRG ★★★★
()
Ответ на: комментарий от WRG

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

tiandrey ★★★★★
()

Помести вместо файлов в нужные места fifo. И потом считывай из них своим процессом, попутно замеряя поток данных.

kvap
()
Ответ на: комментарий от tiandrey

В общем, как я понял, в моем тесте запись идет либо после вызова .close(), либо пока не заполнится внутренний буфер fstream. Я его нащупал в 8 kb. А до этого ни размер, ни сами данные в файле не появляются. Ну и логично же предположить, что тот, кто пишет логи, сделает так, чтобы они записались, а значит закроет файл или вызовет flush. А значит инфа обновится по файлу.

А для того, чтобы понять кто и чего пишет, написал sh скрипт, который вызывает lsof и смотрит - если размер у некого файла поменяется - выводит куда-нибудь. Так его можно оставить на сутки и смотреть что будет. Думаю пока сделать так.

В общем, всем спасибо)

antp
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.