/ / Perl System (Befehl), dann Kill Befehl - Windows, Perl, Netstat

Perl System (Befehl), dann Kill Befehl - Windows, Perl, Netstat

Ich versuche ein System auszugeben netstat -an -p TCP $interval > $log für einen Schlaf von $ Sekunden, und beenden / beenden Sie den Befehl netstat.

Wenn ich benutze start netstat..., meine Sleep- und Kill-Befehle funktionieren, schreiben aber nicht in das Protokoll

Wenn ich nur benutze netstat...Dann schreibt es in die Protokolle, geht aber nicht weiter zu den Befehlen für Schlaf und Tod.

Irgendwelche Ideen, wie man das löst?

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

Vielen Dank!

Antworten:

2 für die Antwort № 1

Warum benutzt du nicht? IPC::Run? Es hat ein kill_kill() Methode, die über Unix und Win32 portiert werden kann (letzteres ist wichtig, wenn Sie unter Windows laufen, da Ihr "Start" möglicherweise darauf hinweist).


Soweit Sie selbst vorgehen, die start xxx Die Weiterleitung funktioniert nicht, daher ist die einfachste Lösung Folgendes:

  • Erstellen Sie eine Batchdatei, um netstat auszuführen und in eine Datei umzuleiten

  • Starten Sie die Batchdatei mit start


0 für die Antwort № 2

Ihr Problem ist, dass system () seinen Befehl ausführtund wartet darauf, dass es zurückkehrt, sodass Sie niemals so weit kommen, wie Sie sleep () aufrufen. Sie müssen netstat von einem anderen Prozess oder im Hintergrund ausführen. Sie können mit fork () dies erreichen, indem Sie einen anderen Prozess aus Ihrem Hauptprozess starten und netstat ausführen:

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

(Ich habe keinen Pskill, also musst du diesen Teil selbst arbeiten lassen ...)


0 für die Antwort № 3

Forks::Super macht diese Aufgabe für Sie leicht.

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