FastNetMon

Thursday 4 February 2016

Как узнать, на какой позиции в файле находится приложение, читающее этот файл?

Вот сижу я бездельничаю в ожидании пока tshark прожует 8 гигабайтный pcap дамп.

Но tshark мало того, что тормозной, так еще и не дает никакой информации о прогрессе.

Но как добиться информации о прогрессе, если очень хочется?

Вспоминаем чудную книгу Linux API interfaces. Там как раз целая глава про файловые дескрипторы и что линукс внутри себя хранит позицию, на которой приложение читает файл!

Итак, достанем ее :)

Для начала узнаем, какие файлы открыты нашим приложением:
sudo ls -la /proc/4487/fd
total 0
dr-x------ 2 administrator administrator  0 февр.  4 18:11 .
dr-xr-xr-x 9 administrator administrator  0 февр.  4 18:08 ..
lrwx------ 1 administrator administrator 64 февр.  4 18:11 0 -> /dev/pts/4
l-wx------ 1 administrator administrator 64 февр.  4 18:11 1 -> pipe:[896628024]
lrwx------ 1 administrator administrator 64 февр.  4 18:11 2 -> /dev/pts/4
lr-x------ 1 administrator administrator 64 февр.  4 18:11 3 -> /dev/urandom

lr-x------ 1 administrator administrator 64 февр.  4 18:11 4 -> /megadump.pcap

Отлично, нам здесь нужна цифра 4 (это номер дескриптора нашего чудо-файла)!

Итак, получаем информацию о позиции чтения в файле:
cat /proc/4487/fdinfo/4 pos: 7641444352flags: 0100000mnt_id: 22
Получаем общий размер файла:
stat -c "%s" /megadump.pcap
8437696302
Ну что же, получим прогресс в процентах:
perl -e 'print scalar 8050094080/8437696302*100, " %\n"'95.4063027617132 %

Ну что же, обнадеживает! 

4 comments :

  1. Оп! Спасибо, полезно.

    ReplyDelete
    Replies
    1. Рад, что пригоидось =)

      Delete
    2. FILENAME=/mnt/iso/dump/mysql.sql.gz;
      PID=$(lsof -t $FILENAME);
      SIZE=$(stat -c '%s' $FILENAME);
      CURRENT=$(awk '{print $2}' /proc/$PID/fdinfo/3 | head -1);
      awk "BEGIN {print $CURRENT/$SIZE*100}"

      В принципе pv утилита наверное тоже самое делает, но я так к ней и не смог привыкнуть. А тут всё нативненько и быстро.

      Delete
    3. pv пропускает поток через себя, а тут можно без внесения лишнего оверхеда :)

      Delete

Note: only a member of this blog may post a comment.