Wie kann ich einen Port für einen bestimmten geplanten Prozess reservieren?

Wie kann ich einen Port für einen bestimmten geplanten Prozess reservieren?

Wir haben einen XYZ-Batch-Prozess, der jeden Tag um 2:00 Uhr startet. Dieser XYZ ist so konfiguriert, dass er auf Port 59070 startet. Sobald er beendet ist, ist dieser Port ein offener Port. Aber vor kurzem hatten wir ein Problem, bei dem ein anderer Prozess 59070 verwendete und als dieser XYZ-Prozess gestartet wurde, konnte er nicht ausgeführt werden.

Als Workaround haben wir die Konfiguration auf den anderen Port 59071 aktualisiert und den Prozess ordnungsgemäß ausgeführt. Meine Frage ist, ob es eine Möglichkeit gibt, diesen Port 59070 zu blockieren und sicherzustellen, dass ihn kein anderer Prozess verwendet. Wir verwenden Solaris 10.

Antwort1

Port 59070 ist einflüchtiger Hafen- eine, die verwendet werden kann fürausgehendTCP-Verbindungen durch beliebige Prozesse. (Das gilt auch für Port 59071, das ist also kein wirklich guter Workaround ...)

Unter Solaris wird der temporäre Portbereich festgelegt durchdas tcp_smallest_anon_portund dastcp_largest_anon_porteinstellbare Parameter. Der Standardbereich liegt zwischen 32.768 und 65.535. Jeder Port in diesem Bereich kann verwendet werdenjederzeitdurch eine ausgehende TCP-Verbindung.

Wie in der Antwort von @Jeff Schaller angegeben, werden Ports nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“ verwendet. Die einzige Möglichkeit, einen Port zu „reservieren“, besteht also darin, immer etwas an ihn gebunden zu haben. Beachten Sie, dass es in dieser Antwort möglich ist, dass ein anderer Prozess den betreffenden Port in der Zeit zwischen dem Beenden eines „Port Saver“-Skripts und dem tatsächlichen bind()Zugriff des „normalen“ Prozesses, der den Port verwendet, beansprucht. Es ist nichtwahrscheinlich, zugegeben, aber es könnte passieren. Und wenn Ihre Verarbeitung kritisch ist, müssen Sie sich meiner Meinung nach darüber Gedanken machen.

Ich empfehle, keinen temporären Port zu verwenden und/oder den Prozess so zu konfigurieren, dass er immer ausgeführt wird, oderverwenden Sie inetadm, um einen Dienst zu konfigurieren, der Ihren Prozess automatisch ausführt. Dadurch wird der inetdProzess ständig an „Ihren“ Port gebunden und dieser wird effektiv für Ihre Verwendung reserviert.

Antwort2

Mir ist keine Möglichkeit bekannt, die Nutzung eines Ports zu blockieren, außer ihn selbst proaktiv zu nutzen. Die allgemeine Idee, die ich vorschlagen würde, wäre, Ihre Stapelverarbeitung wie folgt zu ändern:

  1. Beenden Sie das Skript „Port Saver“

  2. Führen Sie die normale Stapelverarbeitung aus

  3. ein neues „Port Saver“-Skript starten

Dieser Workaround wirdhelfenverhindern, dass ein Rogue-Prozess an den gewünschten Port gebunden wird (ein Prozess könnte den Port zwischen Schritt 1 und 2 oder zwischen Schritt 2 und 3 greifen), aber es wirdnichtVerhindern Sie ein Problem mit dem Batch-Prozess, bei dem dieser scheinbar beendet wird, den Port jedoch nicht freigibt (durch Beenden aller seiner Prozesse).

Ein Beispiel für ein „Port Saver“-Skript in Perl ist:

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

Sie müssen entweder die PID des Skripts speichern oder es suchen und beenden, da es eine Endlosschleife ausführt, während der angegebene Port offen gehalten wird.

verwandte Informationen