【发布时间】:2014-11-28 09:10:43
【问题描述】:
我正在尝试让 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
哈士奇。
编辑:
感谢用户 cmets 修改了脚本创意 - 我现在正尝试在 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.
【问题讨论】:
-
shell script.sh有多长?
-
您将无法在许多计算机上每秒创建 100,000 个进程...您将需要更改
script.sh以便它在自身内部循环运行而不退出,然后执行sleep在每个循环的末尾。这样您就可以创建一个运行时间较长的进程,而不是每秒运行 100,000 个。 -
Shell 脚本并不是特别快,因为它们往往会启动外部进程来执行最琐碎的任务。您可能需要用 Perl 甚至 C 重写脚本才能达到 100000 次/秒。
-
metacpan.org/pod/Proc::ProcessTable 而不是
ps -ef -
小评论:
use strict; use warnings;行应该直接在#!/bin/perl下,这样那些编译指示就会立即打开。您也可以通过open(my $ps, "ps -ef | grep <program> |egrep -v 'shl|grep' >> grep_out.txt");来消除警告。
标签: perl shell loops sleep usleep