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

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

Temos um processo em lote XYZ que começa às 2h todos os dias. Este XYZ está configurado para iniciar na porta 59070. Quando terminar, esta porta será uma porta aberta. Mas recentemente tivemos um problema em que outro processo estava usando 59070 e quando esse processo XYZ foi iniciado, ele falhou na execução.

Como solução alternativa, atualizamos a configuração para uma porta diferente 59071 e executamos o processo OK. Minha dúvida é: existe mesmo assim, podemos bloquear esta porta 59070 e garantir que nenhum outro processo a utilize? estamos usando Solaris 10.

Responder1

A porta 59070 é umaporto efêmero- um que pode ser usado parasaídaConexões TCP por qualquer processo. (Assim como a porta 59071, essa não é realmente uma boa solução alternativa...)

No Solaris, o intervalo de portas efêmeras é definido poro tcp_smallest_anon_porte otcp_largest_anon_portparâmetros ajustáveis. O intervalo padrão é 32.768 a 65.535. Qualquer porta nesse intervalo pode estar em usoa qualquer momentopor uma conexão TCP de saída.

Conforme declarado na resposta de @Jeff Schaller, as portas são usadas por ordem de chegada, portanto, a única maneira de "reservar" uma porta é ter algo vinculado a ela o tempo todo. Observe que, nessa resposta, é possível que outro processo possa capturar a porta em questão no intervalo entre a eliminação de um script de "proteção de porta" e o processo "normal" que usa a porta bind()para ele. Não éprovável, é certo, mas pode acontecer. E se o seu processamento for crítico, acho que você precisa se preocupar com isso.

Eu recomendo não usar uma porta efêmera e/ou configurar seu processo para ser executado o tempo todo, ouuse inetadmpara configurar um serviço que executa seu processo automaticamente. Isso fará com que o inetdprocesso seja vinculado à "sua" porta o tempo todo, reservando-a efetivamente para seu uso.

Responder2

Não conheço uma maneira de bloquear o uso de uma porta, a não ser usá-la proativamente. A ideia geral que eu apresentaria seria alterar o processamento em lote para:

  1. elimine o script "port saver"

  2. execute o processamento em lote normal

  3. inicie um novo script de "proteção de porta"

Esta solução alternativa iráajudaimpedir que um processo não autorizado seja vinculado à porta desejada (um processo pode capturar a porta entre as etapas 1 e 2 ou entre as etapas 2 e 3), mas isso iránãoevitar um acidente com o processo em lote onde esse processo em lote parece terminar, mas não libera a porta (saindo de todos os seus processos).

Um exemplo de script "port saver", 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 eliminá-lo, pois ele executa um loop infinito enquanto mantém a porta aberta.

informação relacionada