Como faço para contar os bytes gerados por outro programa no Bash / Linux?

2

Digamos que eu tenha um programa que grava em vários lugares no sistema de arquivos. Ele é executado a partir de um único executável. Eu quero determinar, em qualquer momento em sua execução (ele é executado por um longo tempo), quantos bytes ele gravou no disco.

A maioria das pessoas parece gostar de ferramentas como pv para esta tarefa, mas não funciona no meu caso, porque o executável em questão grava em muitos lugares diferentes no sistema de arquivos, se eu escrevesse my_exec | pv <whatever> | cat ou algo assim, my_exec apenas escreveria um grande bloco de dados, sem analisá-lo em pastas como deveria.

Da mesma forma, coisas como iotop não são o que eu estou procurando, como gostaria de poder anexar / desanexar um "observador" ao meu processo pesado de IO.

Estou ciente de que a pergunta parece confusa, talvez um exemplo possa ajudar. O que eu gostaria de fazer é algo assim.

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

Ou, alternativamente, algo que envolve / observa outro comando arbitrário, como este:

{ 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.
    
por Zac B 30.08.2012 / 00:43

2 respostas

1

SE seu programa my_exec não exibir a tela, ou qualquer arquivo de log, etc. (por exemplo, inclinar a contagem wchar com saída para stdout, stderr, etc.), por que não apenas olhar diretamente para a contagem de wchar do linux:

grep wchar /proc/${exec_pid}/io

Mais uma vez, o wchar incluirá TODOS os caracteres gravados nos arquivos, e tudo é um arquivo no UNIX, incluindo / dev / null, mas se o programa for silencioso, exceto os arquivos de dados, você obterá uma precisão ou proximidade (+ -1 byte) contagem precisa.

Se houver uma saída do acima mencionado além dos arquivos de dados, será difícil diferenciar de outros arquivos sem poder adicionar contadores diretamente ao código do my_exec (que é o que eu faria se eu tivesse meu_exec fonte, de qualquer maneira - io para um único contador seria mínimo).

Essa contagem lhe dará total desde o início do PID. Cálculo desde a última verificação é uma questão de armazenar algum valor visto pela última vez em um arquivo temporário ou variável, alguma matemática simples, etc. Um script rápido e sujo, sem verificação de erros, concisão, parâmetros extravagantes, etc.:

#!/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

Espero que ajude.

    
por 19.03.2013 / 21:36
0

Você já tentou strace ? Para anexá-lo ao processo em execução, basta digitar

strace -p $PID
    
por 30.08.2012 / 00:51