1

我正在尝试让 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.
4

2 回答 2

1

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

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

于 2014-10-03T11:43:23.140 回答
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 次/秒的速度运行。

于 2014-10-03T11:44:25.320 回答