2

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

Большинству людей, похоже, нравятся такие инструменты, как pv для этой задачи, но в моем случае это не сработает, потому что рассматриваемый исполняемый файл записывает в разные места файловой системы, если бы я написал my_exec | pv <whatever> | cat или что-то в этом роде , my_exec просто записывает большой блок данных, не разбирая его по папкам, как следует.

Точно так же, такие вещи, как iotop , не то, что мне нужно, поскольку я хотел бы иметь возможность прикрепить / отсоединить "наблюдателя" к моему тяжелому процессу ввода-вывода.

Я знаю, что вопрос кажется запутанным, возможно, пример поможет. То, что я хотел бы сделать, это что-то вроде этого.

my_exec &
local exec_pid = $?

mystery_command ${exec_pid} # continuously writes out the number of bytes  
                            # written to disk by my_exec since the invocation  
                            # of mystery_command

Или, альтернативно, что-то, что оборачивает / смотрит другую произвольную команду, например так:

{ my_exec } | mystery_command # my_exec will still write to folders as it  
                              # should, but mystery_command will continuously  
                              # output the number of bytes written to disk by  
                              # the attached {} group.

2 ответа2

1

Если ваша программа my_exec не выводит на экран или в какие-либо файлы журналов и т.д. (Например, искажает счетчик wchar с выводом в stdout, stderr и т.д.), Почему бы просто не посмотреть прямо на счетчик linux wchar:

grep wchar /proc/${exec_pid}/io

Опять же, wchar будет включать ВСЕ символы, записанные в файлы, и все в UNIX - это файлы, включая /dev /null, но если программа не будет использовать ничего, кроме файлов данных, вы получите точное или почти (+-1 байт) точное значение. сосчитать.

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

Это количество даст вам общее количество с момента создания PID. Вычисление с момента последней проверки заключается в сохранении последнего увиденного значения во временном файле или переменной, некоторой простой математической оценке и т.д. Быстрый и грязный bash-скрипт без проверки ошибок, краткости, необычных параметров и т. Д .:

#!/bin/bash
# one param, PID of running process.

COUNTFILE="/tmp/counter"
WAIT="2"

if [ -r "$COUNTFILE" ]; then
        LCOUNT="`cat $COUNTFILE`"
else
        LCOUNT=0
fi

cd /proc/$1
while true; do
        MYSTAMP="`date`"
        TCOUNT="`grep wchar io |cut -d':' -f2`"
        NCOUNT="`expr $TCOUNT - $LCOUNT`"
        printf "$MYSTAMP: %9s bytes total, %9s bytes new\n" $TCOUNT $NCOUNT
        LCOUNT="$TCOUNT"
        echo "$LCOUNT" >$COUNTFILE
        sleep $WAIT
done

# don't remove count file
exit

Надеюсь, это поможет.

0

Вы пробовали Strace? Чтобы прикрепить его к уже запущенному процессу, просто введите

strace -p $PID

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