Die ressourcenfreundliche Art, dem Benutzerprogramm anzuzeigen, hängt nicht


10

Ich habe ein Perl-Skript auf einem * nix-System, das zu einem bestimmten Zeitpunkt mehr als 50.000 Textzeilen verarbeitet. Dies dauert einige Zeit. Ich versuche einen ressourcenfreundlichen Weg zu finden, um den Benutzer wissen zu lassen, dass das Programm nicht hängt, während es den gesamten Text verarbeitet.

Derzeit drucke ich die Ausgabe in Echtzeit, während der Text verarbeitet wird. Ich spüle den Ausgabepuffer und drucke dann die Ausgabe in einer Zeile mit \r. Dies scheint ein unnötiger Ressourcenverbrauch zu sein, da es fast doppelt so lange dauert, als wenn ich nichts drucke, aber wie gesagt, wenn ich nichts drucke, sieht es so aus, als ob das Programm hängen bleibt.

Meine Frage: Gibt es eine Standard- oder einfache Möglichkeit, den Benutzer darüber zu informieren, dass das Programm tatsächlich ausgeführt wird, während lang laufende Aufgaben ausgeführt werden?


Welches Unix? Wenn es sich um FreeBSD handelt, können Sie überprüfen, ob es noch beschäftigt ist, indem Sie Control-T senden (dies ist der Standardbefehl für den Status ).
Hennes

Antworten:


6

[Ich habe gerade festgestellt, dass Ihr Skript Perl ist , aber es gilt dieselbe Logik print "\r"usw. Sie möchten STDERRdie Pufferung verwenden oder deaktivieren $| = 1. Siehe unten.]

Eine Möglichkeit zum Implementieren einer CLI- "Fortschrittsanzeige" besteht in der Verwendung des \rZeichens (Wagenrücklauf). Dies bringt den Cursor an den Anfang der aktuellen Zeile:

#!/bin/bash

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

Wenn es keinen Sinn ergibt, probieren Sie es einfach aus.

Mit dieser Technik können Sie angeben, wie viele Zeilen oder Tausende von Zeilen bisher verarbeitet wurden. Zehn oder Hunderte von Zeilen können gut sein, da es nicht zu oft ist (mehr Updates == langsamere Laufzeit), aber wahrscheinlich immer noch oft genug, um zu zeigen, dass der Fortschritt fortgesetzt wird. Sie können eine Einheit angeben oder einfach Nullen anhängen.

Beachten Sie die Verwendung von -nund -emit echo, das ist wichtig.

Sie können auch \b(Rücktaste) verwenden, um einen ähnlichen Effekt zu erzielen.


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

Drucken Sie eine einzelne aus, .ohne während der Verarbeitung einen Zeilenumbruch zu wiederholen. Uralte Technik.

So bekommen Sie:

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

Einfach und effektiv.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.