ユーザープログラムにハングアップしていないことを示すリソースにやさしい方法


10

* nixシステムにPerlスクリプトがあり、ある時点で50,000行以上のテキストを処理しています。これには時間がかかります。このテキストをすべて処理している間、プログラムがハングしていないことをユーザーに知らせるためのリソースにやさしい方法を見つけようとしています。

現在、テキストの処理中に出力をリアルタイムで印刷しています。出力バッファをフラッシュしてから、で出力を1行に出力してい\rます。これは、何も印刷しない場合と比べてほぼ2倍の時間がかかるため、不必要なリソースの使用のようですが、前述したように、何も印刷しない場合、プログラムがハングしているように見えます。

だから私の質問:実行時間の長いタスクを実行しているときにプログラムが実際に実行されていることをユーザーに知らせるための標準的または簡単な方法はありますか?


どのUNIX?FreeBSDの場合は、Control-T(これはデフォルトのStatusコマンドです)を送信して、まだビジーかどうかを確認できます。
Hennes

回答:


6

[私はちょうどあなたのスクリプトがあり実現perlの、が、同じロジックが適用されるprint "\r"など、あなたが使用したいと思うでしょうSTDERR、バッファリングをオフまたは他のターン$| = 1。下をご覧ください。]

CLIの「進行状況インジケータ」を実装する1つの方法は、\r(復帰)文字を使用することです。これにより、カーソルが現在の行の先頭に移動します。

#!/bin/bash

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

意味がない場合は、試してみてください。

この手法を使用して、これまでに処理された行数または行数を示すことができます。数十行または数百行は、それほど頻繁ではない(更新が増える==実行時間が遅くなる)ため、良いかもしれませんが、おそらく、進行状況が継続していることを示すのに十分な頻度です。単位を指定するか、ゼロを追加するだけです。

使用に注意してください-n-eしてecho重要です。

\b(バックスペース)を使用して同様の効果を得ることができます。


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

.処理中に改行をエコーせずに1枚印刷します。古き良き技術。

だからあなたは得る:

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

シンプルで効果的。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.