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
Respostas:
funciona bem, então @Shadur está certo e há buffer em jogo.
Adicionar o
sed
stripper à mistura mostra que é o culpado (mostra apenas 0 e 30):Agora que o problema é conhecido, você tem várias opções. O mais limpo seria arredondar / reduzir a porcentagem em
awk
com manipulação matemática ou de string, mas como você possui o GNUsed
, basta adicionar-u
ou--unbuffered
fazer o truque.No entanto, por uma questão de integridade, um caso de teste simples mostra
awk
também o buffer:Mas você já lida com
fflush
isso, então não espero problemas.fonte