2011-10-19 108 views
2

我試圖輸出一個系統爲$秒的睡眠,然後退出/殺死netstat命令,但無法使其正常工作。Perl系統(命令)然後殺死命令

如果我使用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"; 

謝謝!

+2

如果我們能看到源代碼,提出建議會更容易。另外,'start'聞起來很像Windows,這可能會影響答案。如果這是在Windows系統上,請將[tag:windows]添加到問題的標籤上。謝謝! – sarnold

+0

是的,這是用於windows..will稍後添加代碼,這種打字不能很好地從移動設備工作。 – user967536

+0

不要試圖將您的消息來源納入評論;它只是不會工作。相反,請使用問題下的[編輯]鏈接在其中添加源代碼。謝謝! – sarnold

回答

2

爲什麼不使用IPC::Run?它有一個kill_kill()方法,可以在Unix和Win32上移植(如果你在Windows上運行,後者很重要,因爲你的「開始」似乎可能表明)。


至於你自己的方法,該start xxx重定向不起作用,因此最簡單的解決方法是:

  • 創建一個批處理文件運行netstat並重定向到一個文件

  • 啓動批處理文件start

+0

我認爲批處理文件選項是解決方案。謝謝! – user967536

0

你的T盧布是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"; 

(我沒有pskill,所以你必須讓這部分工作由你自己...)

+0

我不認爲這將適用於Windows,這是我將主要用於它的。謝謝! – user967536

+0

我在Windows上編寫並測試過它。 fork()曾經是一個問題,但這些日子並不多。 – Alex

0

Forks::Super使這種任務容易爲你。

use Forks::Super; 
fork { cmd => $netstat_cmd, timeout => $seconds }; 
wait;