Como tornar uma porta dedicada para um processo agendado específico?

2

Temos um processo em lote XYZ que começa às 2:00 todos os dias. Este XYZ está configurado para iniciar na porta 59070. Uma vez terminada esta porta é uma porta aberta. Mas recentemente nós tivemos um problema onde, outro processo estava usando 59070 e quando este processo XYZ começou, ele falhou em rodar.

Como solução alternativa, atualizamos a configuração para a porta diferente 59071 e executamos o processo em OK. Minha consulta é que, existe de qualquer maneira, podemos bloquear esta porta 59070 & garantir que nenhum outro processo a use? estamos usando o Solaris 10.

    
por GurMan 24.10.2016 / 01:32

2 respostas

1

A porta 59070 é uma porta efêmera - um que pode ser usado para conexões TCP de saída por qualquer processo. (Como é a porta 59071, de modo que não é realmente uma boa solução ...)

No Solaris, o intervalo de portas efêmeras é definido por tcp_smallest_anon_port e os parâmetros ajustáveis tcp_largest_anon_port . O intervalo padrão é de 32.768 a 65.535. Qualquer porta nesse intervalo pode estar em uso a qualquer momento por uma conexão TCP de saída.

Como afirmado na resposta do @Jeff Schaller, as portas são usadas por ordem de chegada, então a única maneira de "reservar" uma porta é ter algo ligado a ela o tempo todo. Observe que, nessa resposta, é possível que outro processo possa pegar a porta em questão no tempo entre a morte de um script "protetor de porta" e o processo "normal" que usa a porta realmente bind() ing. Não é provável , admitidamente, mas pode acontecer. E se o seu processamento for crítico, acho que você precisa se preocupar com isso.

Eu recomendaria não usar uma porta efêmera e / ou configurar seu processo para ser executado o tempo todo ou use inetadm para configurar um serviço que execute seu processo automaticamente . Isso fará com que o processo inetd seja vinculado à porta "seu" o tempo todo, reservando-o efetivamente para seu uso.

    
por 24.10.2016 / 11:30
0

Não conheço uma maneira de bloquear uma porta de uso, além de usá-la de maneira proativa. A ideia geral que eu colocaria seria alterar o processamento em lote para:

  1. mate o script "protetor de porta"

  2. execute o processamento em lote normal

  3. inicie um novo script "protetor de porta"

Esta solução alternativa ajudará a impedir que um processo invasivo seja vinculado à porta desejada (um processo pode capturar a porta entre as etapas 1 e 2 ou entre as etapas 2 e 3), mas ele não evitará um contratempo no processo em lote em que o processo em lote parece terminar, mas não libera a porta (ao sair de todos os seus processos).

Um exemplo de script "protetor de porta", em perl, é:

#!/usr/bin/env perl
# listens on the given port
use strict;
use IO::Socket;

my $port = shift or die "Usage: $0 <port>";

my $socket = new IO::Socket::INET(
        LocalHost => '0.0.0.0',
        LocalPort => $port,
        Proto => 'tcp',
        Listen => 1,
        Reuse => 1,
        )
  or die "Cannot create socket: $!\n";

while (1) {
  my $c = $socket->accept();
  shutdown($c, 2);
}

Você precisaria salvar o PID do script ou localizá-lo e matá-lo, pois ele executa um loop infinito enquanto mantém a porta especificada aberta.

    
por 24.10.2016 / 04:19