我正试图让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
语句的简写),因此为了清楚起见,您不妨将其放在文件的顶部。