Maneira amigável de recursos para indicar ao programa do usuário não está pendurada

10

Eu tenho um script Perl em um sistema * nix que, em um ponto, está processando mais de 50.000 linhas de texto. Isso leva algum tempo. Estou tentando encontrar uma maneira amigável de recursos para que o usuário saiba que o programa não está travando enquanto processa todo esse texto.

Atualmente, estou imprimindo a saída em tempo real enquanto o texto está sendo processado. Estou liberando o buffer de saída e depois imprimindo a saída em uma linha com \r. Esse parece ser um uso desnecessário de recursos, porque leva quase o dobro do tempo em que não imprimo nada, mas como já disse, ao imprimir nada, parece que o programa está travando.

Então, minha pergunta: existe uma maneira padrão ou simples de informar ao usuário que o programa está realmente executando enquanto executa tarefas de execução longa?

BryanK
fonte
Qual unix? Se for FreeBSD, você poderá verificar se ainda está ocupado enviando Control-T (que é o comando Status padrão ).
Hennes

Respostas:

6

[Acabei de perceber que seu script é perl , mas a mesma lógica se aplica print "\r", etc. Você deseja usar STDERRou desativar o buffer $| = 1. Veja abaixo.]

Uma maneira de implementar um "indicador de progresso" da CLI envolve o uso do caractere \r(retorno de carro). Isso traz o cursor para o início da linha atual:

#!/bin/bash

count=0
while ((1)); do
    echo -ne "\rCount: $count"
    sleep 1;
    count=$(($count+1));
done     

Se não faz sentido, tente.

Você pode usar essa técnica para indicar quantas linhas, ou milhares de linhas, foram processadas até o momento. Dezenas ou centenas de linhas podem ser boas, uma vez que não é muito frequente (mais atualizações == tempo de execução mais lento), mas provavelmente ainda com freqüência suficiente para mostrar que o progresso continua. Você pode especificar uma unidade ou apenas acrescentar zeros.

Observe o uso de -ne -ecom echoisso é importante.

Você também pode usar \b(backspace) para efeito semelhante.


Em perl:

#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);

$| = 1;  # Pipeline stdout (i.e., no buffering).

my $count = 1;
while ($count) {
    print "\rCount $count";
    sleep 1;
    $count++;
}               
Cachinhos Dourados
fonte
3

Imprima uma única .sem repetir uma nova linha enquanto processa. Técnica antiga.

Então você obtém:

Processing...............

Simples e eficaz.

Kurtm
fonte