指示用户程序的资源友好方式未挂起


10

我在* nix系统上有一个Perl脚本,有一点正在处理50,000多行文本。这需要一些时间。我正在尝试找到一种资源友好的方式,以使用户知道程序在处理所有这些文本时未挂起。

目前,由于正在处理文本,因此我正在实时打印输出。我正在刷新输出缓冲区,然后使用一行打印输出\r。这似乎是对资源的不必要使用,因为它花费的时间几乎是什么都不打印的两倍,但是正如我已经说过的,当什么也不打印时,程序似乎挂了。

所以我的问题是:有没有一种标准或简单的方法可以让用户在执行长时间运行的任务时知道程序确实正在运行?


哪个Unix?如果是FreeBSD,则可以通过发送Control-T(这是默认的Status命令)来检查它是否仍然很忙。
汉尼斯,2013年

Answers:


6

[我刚刚意识到您的脚本是perl,但是适用相同的逻辑print "\r",等等。您将要使用STDERR或关闭缓冲,$| = 1。见底部。

实现CLI“进度指示器”的一种方法涉及\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

.在处理过程中打印出单个而不回显换行符。古老的技术。

这样就得到:

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

简单有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.