La forma amigable de recursos para indicar que el programa de usuario no está colgando

10

Tengo un script Perl en un sistema * nix que, en un momento, está procesando más de 50,000 líneas de texto. Esto lleva algo de tiempo. Estoy tratando de encontrar una forma amigable de recursos para que el usuario sepa que el programa no se cuelga mientras procesa todo este texto.

Actualmente estoy imprimiendo resultados en tiempo real mientras se procesa el texto. Estoy vaciando el búfer de salida y luego imprimiendo la salida en una línea con \r. Esto parece ser un uso innecesario de los recursos porque lleva casi el doble de tiempo que cuando no imprimo nada, pero como he dicho, cuando no imprimo nada, parece que el programa se está bloqueando.

Entonces, mi pregunta: ¿existe una manera estándar o simple de informar al usuario que el programa realmente se está ejecutando mientras realiza tareas de larga duración?

BryanK
fuente
Cual unix? Si es FreeBSD, puede verificar si todavía está ocupado enviando Control-T (que es el comando de estado predeterminado ).
Hennes

Respuestas:

6

[Me he dado cuenta de que su guión es Perl , sino que se aplica la misma lógica, print "\r", etc Usted tendrá que usar STDERRo de lo contrario su vez el uso del búfer, $| = 1. Ver abajo.]

Una forma de implementar un "indicador de progreso" de la CLI implica el uso del carácter \r(retorno de carro). Esto lleva el cursor al comienzo de la línea actual:

#!/bin/bash

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

Si no tiene sentido, simplemente pruébalo.

Puede usar esa técnica para indicar cuántas líneas, o miles de líneas, se han procesado hasta ahora. Decenas o cientos de líneas pueden ser buenas ya que no es muy frecuente (más actualizaciones == tiempo de ejecución más lento) pero probablemente con la frecuencia suficiente para mostrar que el progreso continúa. Puede especificar una unidad o simplemente agregar ceros.

Tenga en cuenta el uso de -ny -econ echo, eso es importante.

También puede usar \b(retroceso) para un efecto similar.


En 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++;
}               
encerrada dorada
fuente
3

Imprima un solo .sin hacer eco de una nueva línea a medida que procesa. Técnica antigua.

Entonces obtienes:

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

Simple y efectivo.

kurtm
fuente