Inicie o comando em segundo plano e faça um poll do tempo de CPU decorrido a cada minuto:
npm test &
while sleep 1m
do
ps -o etime $!
done
Digamos que, se executarmos algum comando longo, como um teste funcional para um site, existe um comando como:
elapsed npm test
em que npm test
é um processo ou script de shell, possivelmente com vários comandos diferentes que podem levar 45 minutos. Seria bom se durante a corrida, ele pudesse imprimir "22 minutos se passaram" a cada minuto ou a cada 5 minutos.
O comando time
pode mostrar o tempo total necessário, mas não o tempo decorrido.
Inicie o comando em segundo plano e faça um poll do tempo de CPU decorrido a cada minuto:
npm test &
while sleep 1m
do
ps -o etime $!
done
Você pode usar pv -t
:
npm test | pv -t
Ou para evitar que a saída de npm
passe por pv
, use um fd que npm
não esteja gravando:
{ npm test 3>&1 >&4 4>&- | pv -t; } 4>&1
Nos moldes da resposta do l0b0 : coloque o trabalho em segundo plano, mas depois execute um loop ocupado em torno da pergunta "ainda está em execução?", emitindo minutos decorridos ao longo do caminho:
#!/bin/sh
start=$(date +%s)
"$@" &
while ps -p $! > /dev/null
do
sleep 1
now=$(date +%s)
if [ $(( (now - start) % 60)) -eq 0 ]
then
printf "%d minutes have elapsed\n" $(( (now - start) / 60))
fi
done
Isso corre o risco de outro processo reutilizar o mesmo PID como nosso processo em segundo plano, se nosso processo terminar e esse outro processo começar enquanto estamos dormindo.
Para relatar os minutos decorridos a cada 5 minutos em vez de a cada minuto, basta alterar o primeiro 60 para um 300 .