Il modo amichevole delle risorse per indicare al programma utente non è sospeso


10

Ho uno script Perl su un sistema * nix che, a un certo punto, sta elaborando oltre 50.000 righe di testo. Questo richiede del tempo. Sto cercando di trovare un modo intuitivo per far sapere all'utente che il programma non si blocca mentre sta elaborando tutto questo testo.

Attualmente sto stampando l'output in tempo reale mentre il testo viene elaborato. Sto scaricando il buffer di output, quindi stampando l'output su una riga con \r. Questo sembra essere un uso non necessario delle risorse perché impiega quasi il doppio rispetto a quando non stampa nulla, ma come ho già detto, quando si stampa nulla sembra che il programma sia sospeso.

Quindi la mia domanda: esiste un modo standard o semplice per far sapere all'utente che il programma è effettivamente in esecuzione durante l'esecuzione di attività di lunga durata?


Quale unix? Se è FreeBSD, puoi verificare se è ancora occupato inviando Control-T (che è il comando di stato predefinito ).
Hennes,

Risposte:


6

[Ho appena realizzato lo script è perl , ma applica la stessa logica, print "\r"ecc Si vuole utilizzare STDERRo turno altro fuori buffering, $| = 1. Vedi in basso.]

Un modo per implementare un "indicatore di avanzamento" della CLI prevede l'uso del carattere \r(ritorno a capo). Questo porta il cursore all'inizio della riga corrente:

#!/bin/bash

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

Se non ha senso, provalo.

È possibile utilizzare questa tecnica per indicare quante linee o migliaia di linee sono state elaborate finora. Decine o centinaia di righe potrebbero essere buone poiché non è troppo frequente (più aggiornamenti == tempo di esecuzione più lento) ma probabilmente ancora abbastanza spesso da mostrare che i progressi continuano. È possibile specificare un'unità o semplicemente aggiungere zeri.

Nota l'uso di -ne -econ echo, questo è importante.

Puoi anche usare \b(backspace) per effetti simili.


In 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++;
}               

3

Stampa un singolo .senza fare eco a una nuova riga durante l'elaborazione. Tecnica secolare.

Quindi ottieni:

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

Semplice ed efficace

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.