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

时间:2014-10-03 09:47:22

标签: perl shell loops sleep usleep

我试图让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.

2 个答案:

答案 0 :(得分:1)

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

顺便说一下:use语句只执行一次(它实际上是包含在require子句中的BEGIN { }语句的简写),所以你为了清楚起见,不妨把它放在文件的顶部。

答案 1 :(得分:1)

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

#!/usr/bin/perl

use strict;
use warnings;

my $cmd = 'lxc-start';

my $cmd_re = qr|/\Q$cmd\E$|;

$| = 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: $pid\n";
            }
        }
    }
    closedir PROC;
    # sleep 1;
}

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