【问题标题】:Perl - Show progress during execution of a system() commandPerl - 在执行 system() 命令期间显示进度
【发布时间】:2013-12-11 17:45:29
【问题描述】:

我正在尝试编写一个执行 RKHunter 扫描的 Perl CGI。在执行命令时,我想显示一些指示进度的东西,而不是要重定向到另一个文件的实际输出。到目前为止的代码是:

open(my $quik_rk, '-|', 'rkhunter', '--enable', '"known_rkts"') or print "ERROR RUNNING QUICK ROOTKIT CHECK!!";
        while(<$quik_rk>)
        {       print ".";
        }       
        print "\n";
        close($quik_rk);

这不显示任何输出,并且在等待执行完成时出现空白屏幕。所有的点都一起打印到屏幕上,而不是一个接一个。此外,当我使用以下重定向时,该命令根本不执行:

open(my $quik_rk, '-|', 'rkhunter', '--enable', '"known_rkts"', '>>', '/path/to/file') or print "ERROR RUNNING QUICK ROOTKIT CHECK!!";

如何解决这个问题,将详细输出重定向到一个文件,并且屏幕上只有一个 .... 稳步前进?

【问题讨论】:

标签: perl cgi


【解决方案1】:
$|=1;

在脚本的开头。 这会打开自动刷新,因此每次打印都会实际打印,而不是在刷新缓冲区之前等待换行符。

另见:http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandles

【讨论】:

  • 那么我是否需要在执行后关闭自动刷新以恢复正常行为?
  • 每次打印命令后都会继续刷新。因此,除非您确实希望在同一个脚本中实际打印之前缓冲几个没有换行符的打印命令,否则您可能不会注意到它正在运行。但是您当然可以在之后立即使用$|=0; 将其关闭。然后它会回到只在遇到换行符时打印。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
相关资源
最近更新 更多