简单的PERL脚本可以非常快速地循环



我正试图让perl脚本快速循环(在Solaris中)。

我有这样的东西:

#! /bin/perl
while ('true')
{
 use strict;
 use warnings;
 use Time::HiRes;
 system("sh", "shell script.sh");
 Time::HiRes::usleep(10);
}

我希望perl脚本每10微秒执行一次shell脚本。脚本没有失败,但无论我在脚本中更改usleep的精度多少,脚本仍然每秒只执行大约10次。我需要它循环得比那快得多。

我是不是错过了一些基本的东西?我以前从未使用过perl,但在Solaris中无法获得所需的睡眠速度,所以我选择了perl。

TIA-

哈士奇。

编辑:

由于用户的评论,修改了脚本的想法——我现在正试图在perl中完成这一切,但失败得很惨!基本上,我试图运行PS命令来捕获进程——如果进程存在,我想捕获行并输出到文本文件。

#! /bin/perl
while ('true')
{
 use strict;
 use warnings;
 use Time::HiRes;
 open(PS,"ps -ef | grep <program> |egrep -v 'shl|grep' >> grep_out.txt");
 Time::HiRes::usleep(10);
}

这将返回以下错误:

Name "main::PS" used only once: possible typo at ./ps_test_loop.pl line 9.

这是一个纯perl程序(不启动任何外部进程),用于查找运行特定可执行文件的进程:

#!/usr/bin/perl
use strict;
use warnings;
my $cmd = 'lxc-start';
my $cmd_re = qr|/Q$cmdE$|;
$| = 1;
while (1) {
    opendir PROC, "/proc" or die $!;
    while (defined(my $pid = readdir PROC)) {
        next unless $pid =~ /^d+$/;
        if (defined(my $exe = readlink "/proc/$pid/exe")) {
            if ($exe =~ $cmd_re) {
                print "pid: $pidn";
            }
        }
    }
    closedir PROC;
    # sleep 1;
}

在我的电脑上,它以每秒250次的速度运行。

瓶颈是创建进程、管道和打开输出文件。您应该最多做一次,而不是在每次迭代中都这样做。这就是为什么如果你想让它更快,你需要用Perl做所有的事情。这意味着:不要调用ps命令或任何其他命令。相反,按照注释的建议,从/proc中读取或使用Proc::ProcessTable。

顺便说一句:use语句只执行一次(它本质上是封装在BEGIN { }子句中的require语句的简写),因此为了清楚起见,您不妨将其放在文件的顶部。

相关内容

  • 没有找到相关文章

最新更新