Timeout perl

1. Timeout perl

cléo
sayde

(usa Outra)

Enviado em 05/12/2016 - 09:46h

Bom dia gostaria de ajuda no meu script, o que necessito e que assim que o script recebesse o primeiro comando aguardasse 10 min para receber qualquer outro comando isso seria possível qual caminho devo tomar?

use IO::Socket::INET;

# auto-flush on socket
$| = 1;

# creating a listening socket
my $socket = new IO::Socket::INET (
LocalHost => '192.168.56.1',
LocalPort => '6565',
Proto => 'tcp',
Listen => 5,
Reuse => 1
);
die "cannot create socket $!\n" unless $socket;
print "server waiting for client connection on port 6565\n";

while(1)
{
# waiting for a new client connection
my $client_socket = $socket->accept();

# get information about a newly connected client
my $client_address = $client_socket->peerhost();
my $client_port = $client_socket->peerport();
print "connection from $client_address:$client_port\n";

# read up to 1024 characters from the connected client
my $data = "";
$client_socket->recv($data, 1024);
print "received data: $data\n";
$datestring = localtime();

if ($data eq vm) {
print "Restaurando vm\n";
print "$datestring\n";
system('start vm.cmd');
}
if ($data eq vm1) {
print "Restaurando vm-01\n";
print "$datestring\n";
system('start vm1.cmd');
}

# write response data to the connected client
$data = "tudo ok";
$client_socket->send($data);

# notify client that response has been sent
shutdown($client_socket, 1);
}

$socket->close();



  


2. Re: Timeout perl

Daniel Vinciguerra
dvinciguerra

(usa Debian)

Enviado em 05/12/2016 - 10:37h


A primeira coisa que devemos ter em mente é de que como você esta usando syscall, você não vai ter como precer o termino ou ter controle sobre o seu comando.

Agora respondendo sobre o timeout...

Dando uma analisada geral no seu código, imagino que vc esta fazendo um serviço que poderá receber comando via rede para realizar alguma ação... se vc utilizar um sleep nesse cara ele vai travar seu server e ele não vai executar mais e ficará nada apenas aguardando seu sleep terminar.

Se o seu objetivo não é ser exatamente preciso com o tempo, você pode fazer um calculo simples de data, usando o Time::Piece por exemplo, para gerar um tipo de data de controle e que verifique a hora e "habilite" a execução de comandos.


use Time::Piece;
sub time_now { localtime }

my $MINUTE = 60*10;
my $saved = time_now() + $MINUTE;

while(1){
# do your command here
if(time_now() == $saved){
print "Hello command \n";
$saved = time_now() + $MINUTE;
}
}


Existem outras opções mais robustas para se trabalhar com data no perl como o Time::HiRes, mas acho que isso não é necessário para sua implementação.

Outra solução também é utilizar uma implementação de fila de comandos que receba os comandos, armazene e execute de 10 em 10 min cada comando. Esse porem acho que atende menos sua necessidade.

Espero ter ajudado....

Grande abraço



3. Re: Timeout perl

cléo
sayde

(usa Outra)

Enviado em 05/12/2016 - 10:43h

meu objetivo e só travar o recebimento de comandos mesmo pois estou usando para restaurar duas vms no virtualbox pela rede mais acontece de enviar 2 ou mais vezes o comando pra restaurar essa vm que acaba travando ela ai quero que receba só o primeiro comando e não receba outro por 10 min obrigado pela resposta tentarei usar o sleep


4. Re: Timeout perl

cléo
sayde

(usa Outra)

Enviado em 05/12/2016 - 10:50h

testei usar o sleep mais o que aconteceu foi que ele espera o tempo e depois executa quantos comando tiverem sido enviados o que pretendo e só executar o primeiro comando e ignorar os próximos durante 10 min






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts