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 マイクロ秒ごとにシェル スクリプトを実行するようにします。スクリプトは失敗しませんが、スクリプト内で usleep の精度をどれだけ変更しても、スクリプトは 1 秒あたり約 10 回しか実行されません。それよりもはるかに速くループする必要があります。

ここで何か基本的なことが欠けていますか? これまで perl を使用したことはありませんが、Solaris では必要なスリープ速度が得られないため、perl を選択しました。

ティア

ハスキー。

編集:

ユーザーのコメントのおかげでスクリプトのアイデアが改訂されました - 私は今、すべてを 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

ボトルネックは、プロセス、パイプの作成、および出力ファイルを開くことです。各反復で行うのではなく、多くても 1 回行う必要があります。そのため、これを高速化するには、すべてを Perl で行う必要があります。psつまり、コマンドやその他のコマンドを呼び出さないでください。代わりに、コメントが示唆するように、Proc::ProcessTable/procから読み取るか、使用してください。

ちなみに、useステートメントrequire1 回だけ実行されます (これは本質的に、句でラップされたステートメントの省略形です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 に答える