dd mostra o progresso 'bruto' durante a saída da tubulação

0

Estou tentando executar uma operação dd específica e anexando dados "brutos" da transferência para um arquivo de log que será pesquisado por outra coisa, para fornecer uma exibição ao vivo da transferência em outra interface (ou seja, não terminal).

A operação dd é:

dd if=/some/lvm bs=512K | gzip -c > /tmp/whatever

A maneira mais simples que eu posso ver é a saída desse comando para um arquivo e matar -SIGUSR1 pid simultaneamente e visualizar a saída, embora eu não possa encontrar uma maneira de armazenar o pid do processo em uma variável e usá-lo no comando kill .

Eu vi esse um dois forros ao redor:

dd if=/some/lvm of=/some/fat/image/which/I/cant/use bs=512K& pid=$!; \
sleep 1; while [[ -d /proc/$pid ]]; do kill -USR1 $pid && sleep 1; done

Embora eu não entenda como ele puxa o pid como uma variável, não posso modificá-lo para trabalhar com minha saída canalizada.

Eu estou feliz olhando para alternativas para dd, embora o mais apenas dar complicação ainda mais, como dcfldd que atualiza a mesma linha embora alguns, eu presumo método curses-like. Isso torna difícil tirar um instantâneo dessa saída a cada segundo e extrair os dados de que preciso. Se houver uma maneira fácil, posso lidar com isso ou até mesmo canalizar para pv se puder obter a saída "bruta".

Por favor, me esclareça. ; -)

Atenciosamente

EDIT: Então eu encontrei uma "solução", ainda não é bonita, mas

Eu posso usar pgrep para encontrar um id de processo, então enquanto o comando dd está rodando e sendo enviado para um arquivo, eu rodaria watch -n1 'sudo kill -USR1 $(pgrep ^dd)' para produzir progresso na transferência a cada segundo que pode ser interpretado pelo poller.

Ainda não é uma solução elegante e parece um bocado. Se há uma maneira melhor, ainda estou aberto a sugestões. : -)

    
por notfound 28.02.2016 / 18:47

3 respostas

1

A melhor resposta é pv , que permite ver o progresso de qualquer processo que você possa canalizar.

dd if=/some/lvm bs=512K | pv | gzip -c > /tmp/whatever

Você pode até usar isso para seu uso típico de dd de criação ou gravação de imagens de disco canalizando dd para si mesmo por meio de pv :

dd if=/dev/cdrom | pv | dd of=/path/to/some.iso
    
por 28.02.2016 / 18:51
0

Se você não puder usar pv , estará no caminho certo com kill -USR1 . Dado o seu comando inicial de dd if=/some/lvm bs=512K | gzip -c > /tmp/whatever , eu faria algo assim com o contexto de um par de scripts:

dd if=/some/lvm bs=512K | gzip -c > /tmp/whatever &
PID=$! # $! is set to the PID of the last backgrounded process
echo $PID > /var/run/dd_pid.txt  # So that other scripts can read it
fg
rm /var/run/dd_pid.txt

Enquanto isso, no seu outro script:

PID=$(cat /var/run/dd_pid.txt)
if [[ 0 -ne $? ]]; then
    echo 'PID file not found'
    exit 1
fi
while kill -0 $PID; do
    sleep 1
    kill -USR1 $PID
done
    
por 28.02.2016 / 19:07
0

Este é um script único que deve atingir o objetivo:

(
        dd if=/some/lvm bs=512K &
        pid_dd=$!

        while :; do
                sleep 1
                kill -USR1 $pid_dd
        done &
        pid_monitor=$!

        wait $pid_dd
        kill $pid_monitor
) |
        gzip -c > /tmp/whatever
    
por 28.02.2016 / 21:53

Tags