Sistema di Perl (comando) Comando poi uccidete
Domanda
Sto cercando di produrre un sistema di netstat -an -p TCP $interval > $log
per un sonno di $ secondi, e quindi chiudere / uccidere il comando netstat, ma sto avendo problemi a farlo funzionare correttamente.
Se io uso start netstat...
, il mio sonno e uccidere i comandi di lavoro, ma non scrivere nel registro.
Se io uso solo netstat...
, quindi scrive i registri, ma non si sposterà ai comandi del sonno e uccidere.
Tutte le idee su come risolvere questo ??
$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";
Grazie!
Soluzione
Perché non si utilizza IPC::Run
? Ha un metodo di kill_kill()
che è portabile su Unix e Win32 (quest'ultimo è importante se si sta in esecuzione su Windows come "start" sembra indicare possibilmente).
Per quanto riguarda il proprio approccio, il reindirizzamento start xxx
non funziona, quindi la soluzione più semplice è quello di:
-
Creare un file batch per eseguire netstat e reindirizzamento a un file
-
Lanciare il file batch con
start
Altri suggerimenti
Il problema è che il sistema () esegue il suo comando e attende per tornare, in modo da non ottiene, per quanto chiama sleep (). È necessario eseguire netstat da un altro processo, o in background. È possibile utilizzare fork () per raggiungere questo obiettivo, per la deposizione delle uova un altro processo dal processo principale, e avere quella netstat run:
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";
(non ho pskill, quindi dovrete fare quel lavoro parte da soli ...)
Forks::Super
rende questo tipo di compito facile per voi.
use Forks::Super;
fork { cmd => $netstat_cmd, timeout => $seconds };
wait;