Fazendo uma barra de progresso com "dialog" a partir da saída rsync

16

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

Procurei na internet e encontrei fragmentos, mas ainda estou perdendo algo para fazê-lo funcionar

(Isenção de responsabilidade: essa pode ser uma abordagem totalmente errada e é uma monstruosidade de redirecionamento / canalização)

O que reuni atualmente:

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

Primeiro, tenho o comando rsync real com a opção --progress A saída do rsync é canalizada para o awk e usa o filtro followng 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 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 alimento a saída para sed:

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

O que fornece a seguinte saída:

64
66
68
70
72
74
75
77

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

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

Até onde eu sei, "dialog --gauge" etc. deve aceitar isso, mas mostra apenas que o progresso é de 0% até que subitamente atinja 100%

Alguém pode me apontar na direção certa aqui? Estou longe de uma barra de progresso em funcionamento? Existe uma maneira melhor de conseguir isso?

Saudações,

Christer

EDIT : Depois de levar em conta a resposta @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]*).*/\1/' \ 
 | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70
chr1573r
fonte
11
Parece que algo (provavelmente awk) está armazenando em buffer a saída até que o programa antes do pipeline envie o EOF. Não sei como verificar ou resolver isso, embora ...
Shadur

Respostas:

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á buffer em jogo.

Adicionar o sedstripper à mistura mostra que é o culpado (mostra apenas 0 e 30):

for i in 10 20 30; do echo $i; sleep 1; done | sed 's/\([0-9]*\).*/\1/' | 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 / reduzir a porcentagem emawk com manipulação matemática ou de string, mas como você possui o GNU sed, basta adicionar -uou --unbufferedfazer o truque.

No entanto, por uma questão de integridade, um caso de teste simples mostra awk também o buffer:

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

Mas você já lida com fflushisso, então não espero problemas.

lynxlynxlynx
fonte
Uau..! Graças um milhão! Adicionar --unfuffered ao sed era a única coisa necessária! Obrigado por compartilhar seu tempo e conhecimento Shadur & lynxlynxlynx!
precisa
Para outras pessoas imaginando como será o comando final: rsync -avz --progress -e "ssh" usuário @ servidor: / home / user / data / / home / user / data | awk -f /home/user/rsync.awk | sed --unfuffered 's / ([0-9] *). * / \ 1 /' | dialog --title "My Gauge" --gauge "Olá, este é um widget de medidor" 20 70
chr1573r 6/06/12
Não tem problema, e seja bem-vindo ao site. :)
Shadur