Опитвам се да извеждам система 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;