Criando uma barra de progresso com “dialog” da saída do rsync

16

Estou procurando uma maneira de filtrar / redirecionar a saída do rsync de uma maneira que possa ser alimentada no comando "dialog --gauge", para que eu possa obter uma barra de progresso com aparência agradável durante a sincronização de arquivos. Atualmente eu testei apenas diretamente no prompt, mas estou planejando fazer isso em um script de shell (bash).

Eu procurei pela internet e encontrei fragmentos, mas ainda sinto falta de algo para que funcione

(Disclaimer: Esta pode ser uma abordagem totalmente errada, e é uma monstruosidade de redirecionamento / piping)

O que eu tenho atualmente montado:

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data | awk -f /home/user/rsync.awk | sed 's/\([0-9]*\).*//' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

Primeiro eu tenho o comando rsync com a opção --progress A saída do rsync é canalizada para o awk e usa o seguinte filtro awk:

{
   if (index($0, "to-check=") > 0)
   {
        split($0, pieces, "to-check=")
        split(pieces[2], term, ")");
        split(term[1], division, "/");
        print (1-(division[1]/division[2]))*100
}
#   else
#   {
#       print "#"$0;
#   }
   fflush();
}

Isso filtra a saída do rsync e fornece a porcentagem no seguinte formato:

53.7037
55.5556
57.4074
59.2593
61.1111
62.963

Então, para se livrar dos números decimais, eu alimentei a saída para sed:

sed 's/\([0-9]*\).*//'

O que dá a seguinte saída:

64
66
68
70
72
74
75
77

Esses números são canalizados para o diálogo assim:

dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 

Até onde eu sei, "dialog --gauge" etc. deve aceitar isso, mas apenas exibe progresso em 0% até que de repente chegue a 100%

Alguém pode me indicar a direção certa aqui? Estou longe de uma barra de progresso de trabalho? Existe uma maneira melhor de conseguir isso?

Atenciosamente,

Christer

EDITAR : Depois de considerar a resposta do @lynxlynxlynx ', a linha de comando correta é:

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data \ 
 | awk -f /home/user/rsync.awk \ 
 | sed --unbuffered 's/([0-9]*).*//' \ 
 | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70
    
por chr1573r 06.08.2012 / 13:40

1 resposta

12
for i in 10 20 30; do echo $i; sleep 1; done | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

funciona bem, então @Shadur está certo e há um buffer em ação.

Adicionando o sed stripper na mistura mostra que é o culpado (apenas mostra 0 e 30):

for i in 10 20 30; do echo $i; sleep 1; done | sed 's/\([0-9]*\).*//' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

Agora que o problema é conhecido, você tem várias opções. O mais limpo seria arredondar / cortar a porcentagem em awk com manipulação de matemática ou string, mas como você tem o GNU sed , apenas adicionando -u ou --unbuffered deve fazer o truque.

No entanto, por questões de integridade, um simples caso de teste mostra que awk também armazena em buffer:

for i in 10 20 30; do echo $i; sleep 1; done | awk '{print $0}' | sed -u 's/\([0-9]*\).*//' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 

Mas você já manipula isso com fflush , então não espero problemas.

    
por 06.08.2012 / 14:32