Aqui está o seu código simplificado e mais legível:
while ps -p $CPPID > /dev/null
do
sleep 10
usbsize=$(/bin/df $DEVICEMOUNTPOINTQ | awk 'NR == 2 {print $3}')
isosize=$(/bin/df $ISOMOUNTPOINTQ | awk 'NR == 2 {print $3}')
awk -v "usbsize=$usbsize" -v "isosize=$isosize" 'BEGIN { printf "%.1f%% copied...\n", 100 * usbsize / isosize }'
done
Sua última linha awk
pode ser substituída por estas duas:
percent=$(echo "$usbsize / $isosize * 100" | bc -l)
printf "%.1f%% copied...\n" $percent
Então, você poderia fazer isso logo antes da declaração printf
:
if (( $(echo "$percent > 100" | bc) == 1 ))
then
break
fi
e adicione wait $CPPID
logo após o final do loop while
. Isso interromperá o progresso da impressão quando 100% for alcançado.
Veja Gerenciamento de processos sobre a confiabilidade dos PIDs (eles são reciclados).
O problema que você está vendo provavelmente se deve ao uso do valor "usado" do sistema de arquivos de destino, em vez da diferença no valor atual do valor inicial.
Tente adicionar uma linha como essa antes do loop while
:
startsize=$(/bin/df $DEVICEMOUNTPOINTQ | awk 'NR == 2 {print $3}')
e mude a linha dentro do loop para:
usbsize=$(/bin/df $DEVICEMOUNTPOINTQ | awk -v "start=$startsize" 'NR == 2 {print $3 - start}')
Claro que tudo isso pode ser evitado se você usou rsync --progress
em vez de cp
.
Editar:
Além disso, tente isso no loop while
como mostrado acima para ver quais são os números usados no cálculo. Isso pode fornecer uma pista sobre o que está acontecendo:
awk -v "usbsize=$usbsize" -v "isosize=$isosize" 'BEGIN { printf "%d of %d, %.1f%% copied...\n", usbsize, isosize, 100 * usbsize / isosize }'