【问题标题】:Printing a progress bar during execution of a command in Perl-CGI在 Perl-CGI 中执行命令期间打印进度条
【发布时间】:2013-12-20 14:16:55
【问题描述】:

我想在我的 Perl-CGI 程序中执行特定命令期间显示一个迭代进度条。我使用CGI::ProgressBar 模块来实现这一点。例如,如果我想在执行 RKHunter 扫描期间显示进度条,这是我编写的代码:

使用 CGI::ProgressBar qw/:standard/; $| = 1;

    print progress_bar( -from=>1, -to=>100 );
    open(my $quik_rk, '-|', 'rkhunter', '--enable', '"known_rkts"') or print "ERROR RUNNING BASIC ROOTKIT CHECK!!";
    # print the progress bar while the command executes     
    while(<$quik_rk>)
    {
            print update_progress_bar;
            #print "<img src=\"ajax-loader.gif\"></img>";
    }
    close($quik_rk);

这很好用。但是,我在上面的代码之后立即对另一个命令(使用 Linux Maldet 进行扫描)尝试相同的操作:

    open(my $quik_lmd, '-|', 'maldet', '-a', '/home?/?/public_html') or print "ERROR RUNNING BASIC MALWARE CHECK!!";
    my $this_ctr = 0;
    while(<$quik_lmd>)
    {       $this_ctr++;
            print update_progress_bar;

    }
    close($quik_lmd);

进度条不执行,但 te 命令本身在后台运行。

我做错了什么? 有没有更好的方法在 Perl-CGI 中的浏览器上显示进度条?

【问题讨论】:

    标签: perl progress-bar cgi


    【解决方案1】:

    我对 RKHunter 不熟悉,但根据您的结果,我猜它会为它运行的每个测试输出一行文本,而另一个命令则不会。

    RKHunter 输出的每一行文本都会触发&lt;$quik_rk&gt; 的下一次迭代。

    第二个命令&lt;$quik_lmd&gt;,它可能是静默的,所以它永远不会触发循环。命令终止后,在您的while 之后继续执行。

    这里的关键是“文本行”。 &lt;$filehandle&gt; 运算符每次看到换行符时都会返回一行文本。为了使用这个结构做你想做的事,你需要强制第二个命令详细说明它的活动,最重要的是,用很多换行符来详细说明。

    或者,您可以打开一个后台进程并使用sleep 来管理您的循环,例如,

    use strict;
    use POSIX qw(WNOHANG);
    my $pid = open(my $quik_rk, '-|', 'sleep', '5'); # replace with your command
    do {
        print "waiting\n"; # update_progress_bar;
        sleep 1; # seconds between update
    } while (waitpid($pid, WNOHANG)==0);
    

    【讨论】:

    • 顺便说一句,使用这种技术,但对 open() 参数稍作改动,您可以观看 curl 命令并制作自己的进度条。我的安装程序有一个 GUI,并在后台启动 Perl,后者启动 curl。你的例行程序为我解决了一个令人沮丧的 12 小时问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多