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!

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top