我试图让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.
答案 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次/秒的速度运行。