Вот сижу я бездельничаю в ожидании пока tshark прожует 8 гигабайтный pcap дамп.
Но tshark мало того, что тормозной, так еще и не дает никакой информации о прогрессе.
Но как добиться информации о прогрессе, если очень хочется?
Вспоминаем чудную книгу Linux API interfaces. Там как раз целая глава про файловые дескрипторы и что линукс внутри себя хранит позицию, на которой приложение читает файл!
Итак, достанем ее :)
Для начала узнаем, какие файлы открыты нашим приложением:
Но 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 %
Ну что же, обнадеживает!
Оп! Спасибо, полезно.
ReplyDeleteРад, что пригоидось =)
DeleteFILENAME=/mnt/iso/dump/mysql.sql.gz;
DeletePID=$(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 утилита наверное тоже самое делает, но я так к ней и не смог привыкнуть. А тут всё нативненько и быстро.
pv пропускает поток через себя, а тут можно без внесения лишнего оверхеда :)
Delete