2

netstat -an -p TCP $interval > $logシステムを $seconds のスリープ状態で出力してから、netstat コマンドを終了/強制終了しようとしていますが、正しく動作させるのに問題があります。

を使用するstart netstat...と、sleep コマンドと kill コマンドは機能しますが、ログに書き込まれません。

のみを使用するnetstat...と、ログに書き込まれますが、sleep および kill コマンドには移行しません。

これを解決する方法についてのアイデアはありますか??

$netstat_cmd = "netstat -an -p TCP $interval >$netstatlog;
$stop_netstat_cmd = "c:\utilities\pskill NETSTAT.exe";
system($netstat_cmd);
sleep $seconds;
system "$stop_netstat_cmd";

ありがとう!

4

3 に答える 3

2

使ってみませんIPC::Runか?UnixとWin32の間で移植可能なkill_kill()メソッドがあります(「開始」が示す可能性があるため、Windowsで実行している場合は後者が重要です)。


独自のアプローチではstart xxxリダイレクトが機能しないため、最も簡単な修正方法は次のとおりです。

  • バッチファイルを作成してnetstatを実行し、ファイルにリダイレクトします

  • でバッチファイルを起動しますstart

于 2011-10-19T01:22:38.597 に答える
0

問題は、system()がコマンドを実行し、コマンドが返されるのを待つため、sleep()を呼び出すことはできません。別のプロセスから、またはバックグラウンドでnetstatを実行する必要があります。fork()を使用して、メインプロセスから別のプロセスを生成し、netstatを実行することで、これを実現できます。

my $interval = 5;
my $netstatlog = "foo.tmp";
my $seconds = 10;

my $netstat_cmd = "netstat -an -p TCP $interval >$netstatlog";
my $stop_netstat_cmd = "pskill NETSTAT.exe";

if (my $pid = fork()) { # make new process
    print "launched netstat $pid\n";
}
else { # this is the "new" process
    system($netstat_cmd);
    exit();
}

sleep $seconds;

system "$stop_netstat_cmd";

(私にはスキルがないので、その部分を自分で機能させる必要があります...)

于 2011-10-19T02:11:33.417 に答える
0

Forks::Superは、この種のタスクを簡単にします。

use Forks::Super;
fork { cmd => $netstat_cmd, timeout => $seconds };
wait;
于 2011-10-19T02:39:45.713 に答える