¿Cómo hacer un puerto dedicado para un proceso programado específico?

¿Cómo hacer un puerto dedicado para un proceso programado específico?

Tenemos un proceso por lotes XYZ que comienza a las 2:00 a. m. todos los días. Este XYZ está configurado para comenzar en el puerto 59070. Una vez que finaliza, este puerto es un puerto abierto. Pero recientemente tuvimos un problema en el que otro proceso estaba usando 59070 y cuando se inició este proceso XYZ, no se pudo ejecutar.

Como solución alternativa, actualizamos la configuración a un puerto diferente 59071 y ejecutamos el proceso correctamente. Mi consulta es: ¿hay alguna forma de bloquear este puerto 59070 y asegurarnos de que ningún otro proceso lo utilice? Estamos usando Solaris 10.

Respuesta1

El puerto 59070 es unpuerto efímero- uno que pueda usarse parasalienteConexiones TCP por cualquier proceso. (Al igual que el puerto 59071, no es realmente una buena solución...)

En Solaris, el rango de puertos efímeros lo estableceeltcp_smallest_anon_port y eltcp_largest_anon_portparámetros ajustables. El rango predeterminado es de 32.768 a 65.535. Cualquier puerto en ese rango puede estar en uso.en cualquier momentomediante una conexión TCP saliente.

Como se indica en la respuesta de @Jeff Schaller, los puertos se utilizan por orden de llegada, por lo que la única forma de "reservar" un puerto es tener algo vinculado a él en todo momento. Tenga en cuenta que en esa respuesta, es posible que otro proceso pueda tomar el puerto en cuestión en el tiempo entre la eliminación de un script de "protector de puerto" y el proceso "normal" que realmente usa el puerto.bind() conectarse a él. Que no esprobable, es cierto, pero podría suceder. Y si su procesamiento es crítico, creo que debe preocuparse por eso.

Recomiendo no usar un puerto efímero y/o configurar su proceso para que se ejecute todo el tiempo, ousarinetadm para configurar un servicio que ejecute su proceso automáticamente. Eso hará que el inetdproceso se vincule a "su" puerto todo el tiempo, reservándolo efectivamente para su uso.

Respuesta2

No conozco ninguna forma de bloquear el uso de un puerto, aparte de usarlo usted mismo de forma proactiva. La idea general que propondría sería cambiar el procesamiento por lotes a:

  1. eliminar el script "port saver"

  2. ejecutar el procesamiento por lotes normal

  3. iniciar un nuevo script de "protector de puerto"

Esta solución alternativaayudaevitar que un proceso no autorizado se vincule al puerto que desea (un proceso podría tomar el puerto entre los pasos 1 y 2 o entre los pasos 2 y 3), pero lo haránoevitar un percance con el proceso por lotes donde ese proceso por lotes parece terminar pero no libera el puerto (al salir de todos sus procesos).

Un script de ejemplo para "proteger puertos", en Perl, es:

#!/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);
}

Necesitará guardar el PID del script o buscarlo y eliminarlo, ya que ejecuta un bucle infinito mientras mantiene abierto el puerto dado.

información relacionada