Existe um comando para mostrar o tempo decorrido durante a execução de um processo longo?

3

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.

    
por 太極者無極而生 30.06.2017 / 14:53

3 respostas

3

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
    
por 30.06.2017 / 15:41
3

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
    
por 30.06.2017 / 16:04
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:

decorrido

#!/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 .

    
por 02.07.2017 / 03:38