Un moyen convivial pour indiquer au programme utilisateur ne se bloque pas

10

J'ai un script Perl sur un système * nix qui, à un moment donné, traite plus de 50 000 lignes de texte. Cela prend du temps. J'essaie de trouver un moyen convivial de faire savoir à l'utilisateur que le programme ne se bloque pas pendant qu'il traite tout ce texte.

Actuellement, j'imprime la sortie en temps réel pendant le traitement du texte. Je vide le tampon de sortie, puis j'imprime la sortie sur une ligne avec \r. Cela semble être une utilisation inutile des ressources car cela prend presque deux fois plus de temps que lorsque je n'imprime rien, mais comme je l'ai dit, lorsque vous n'imprimez rien, il semble que le programme se bloque.

Donc, ma question: existe-t-il un moyen standard ou simple de faire savoir à l'utilisateur que le programme est en cours d'exécution tout en effectuant des tâches de longue durée?

BryanK
la source
Quel Unix? S'il s'agit de FreeBSD, vous pouvez vérifier s'il est toujours occupé en envoyant Control-T (qui est la commande d' état par défaut ).
Hennes

Réponses:

6

[Je viens de réaliser votre script est perl , mais la même logique applique, print "\r"etc. Vous voulez utiliser STDERRou autre tour de mise en mémoire tampon, $| = 1. Voir en bas.]

Une façon de mettre en œuvre un "indicateur de progression" CLI implique l'utilisation du caractère \r(retour chariot). Cela amène le curseur au début de la ligne actuelle:

#!/bin/bash

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

Si cela n'a pas de sens, essayez-le.

Vous pouvez utiliser cette technique pour indiquer combien de lignes, ou des milliers de lignes, ont été traitées jusqu'à présent. Des dizaines ou des centaines de lignes peuvent être bonnes car ce n'est pas trop souvent (plus de mises à jour == un temps d'exécution plus lent) mais probablement encore assez souvent pour montrer que les progrès se poursuivent. Vous pouvez spécifier une unité ou simplement ajouter des zéros.

Notez l'utilisation de -net -eavec echo, c'est important.

Vous pouvez également utiliser \b(retour arrière) pour un effet similaire.


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++;
}               
boucle d'or
la source
3

Imprimez un single .sans faire écho à une nouvelle ligne pendant que vous traitez. Technique séculaire.

Vous obtenez donc:

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

Simple et efficace.

kurtm
la source