/ / Perl system (команда) и след това kill команда - windows, perl, netstat

Системата Perl (команда) след това уби команди - windows, perl, netstat

Опитвам се да извеждам система netstat -an -p TCP $interval > $log за заспиване от $ секунди и след това излизане / убиване на командата netstat, но имам проблеми с това да работи правилно.

Ако използвам start netstat...Моите команди за заспиване и убиване работят, но не записват в дневника.

Ако използвам само netstat..., тогава записва в дневниците, но няма да премине към командите за заспиване и убиване.

Всички идеи за това как да се реши това?

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

Благодаря!

Отговори:

2 за отговор № 1

Защо не го използвате IPC::Run? Има kill_kill() метод, който е преносим през Unix и Win32 (последният е важен, ако работите под Windows, тъй като изглежда, че е възможно да го покажете).


Що се отнася до вашия собствен подход, start xxx пренасочване не работи, така че най-лесното решение е да:

  • Създайте команден файл, за да стартирате netstat и пренасочете към файл

  • Стартирайте командния файл с start


0 за отговор № 2

Вашата беда е, че системата () изпълнява командата сии чака да се върне, така че никога да не стигате до извикване на сън (). Трябва да стартирате 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 $pidn";
}
else { # this is the "new" process
system($netstat_cmd);
exit();
}

sleep $seconds;

system "$stop_netstat_cmd";

(Нямам pskill, така че вие ​​ще трябва да направите тази част да работите сами ...)


0 за отговор № 3

Forks::Super прави този вид задача лесна за вас.

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