2011-10-19 12 views
2

を$ secondsのスリープ状態で出力しようとしていますが、netstatコマンドを終了/終了しても正常に動作するのに問題があります。Perlシステム(コマンド)then killコマンド

私がstart netstat...を使用すると、私のスリープとキルコマンドは機能しますが、ログに書き込まれません。

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"; 

ありがとう!

+2

ソースコードが表示されていれば、提案をする方が簡単です。また、 'start'はWindowsのように多くのにおいをします。これは答えに影響するかもしれません。これがWindowsシステムの場合は、質問のタグに[tag:windows]を追加してください。ありがとう! – sarnold

+0

はい、これはwindows用です。ちょっと後でコードを追加します。このタイプはモバイルデバイスからうまく機能しません。 – user967536

+0

あなたのソースをコメントにしようとしないでください。それだけでうまくいきません。代わりに、あなたの質問の下の[編集]リンクを使用して、そこにソースを追加してください。ありがとう! – sarnold

答えて

2

なぜIPC::Runを使用しませんか?これは、kill_kill()というUnixとWin32で移植可能なメソッドを持っています(あなたの "開始"が表示される可能性があるので、Windowsで実行している場合は後者が重要です)。


限り、独自のアプローチとして、start xxxリダイレクトは動作しませんので、最も簡単な修正はにある:

  • は、netstatコマンドを実行し、ファイルにリダイレクトするバッチファイルを作成します

  • 起動start

+0

バッチファイルのオプションは私のシナリオの修正だと思います。ありがとう! – user967536

0

あなたのトンでバッチファイルrubleはsystem()がコマンドを実行してそれが戻るのを待つので、sleep()を呼び出すまでは決して得られません。別のプロセスまたはバックグラウンドでnetstatを実行する必要があります。あなたは、あなたのメインのプロセスから別のプロセスを生成し、その実行のnetstatコマンドを持っていることによって、これをacheiveする)(フォークを使用することができます。

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"; 

あなたはその部分の作業を行う必要がありますので、(私は、pskillを持っていませんあなた自身で...)

+0

これは私が主にそれを使用しているもので、これはウィンドウではうまくいかないと思います。ありがとう! – user967536

+0

私はそれをWindowsで書いてテストしました。 fork()は以前は問題でしたが、最近はそれほどではありません。 – Alex

0

Forks::Superは、あなたにとってこの種のタスクを容易にします。

関連する問題