特定のスケジュールされたプロセスにポートを専用に割り当てる方法は?

特定のスケジュールされたプロセスにポートを専用に割り当てる方法は?

毎日午前2時に開始するXYZバッチプロセスがあります。この XYZ はポート 59070 から開始するように構成されます。完了すると、このポートはオープンポートになります。しかし、最近問題が発生しました。他のプロセスは59070を使用しており、このXYZプロセスが開始されたときに実行に失敗しました。

回避策として、設定を別のポート59071に更新し、プロセスを正常に実行しました。私の質問は、このポート59070をブロックし、他のプロセスがこのポートを使用しないようにすることができるかどうかです。私たちはSolaris 10を使用しています。

答え1

ポート 59070 はい一時ポート- 1つは次の目的に使用できます。国を離れるすべてのプロセスへのTCP接続。 (ポート59071も同様なので、これは実際には良い解決策ではありません...)

Solarisでは、一時ポート範囲は次のように設定されます。tcp_smallest_anon_porttcp_largest_anon_port調整可能なパラメーター。デフォルトの範囲は32,768〜65,535です。この範囲のすべてのポートがビジーである可能性があります。いつでも発信TCP接続を介して。

@Jeff Schallerの答えによると、ポートは先着順に使用されるため、ポートを「予約」する唯一の方法は、常にポートに何かをバインドすることです。その答えで、「ポートセーバー」スクリプトを終了することと、実際にポートを使用している「一般」プロセスの間に他のプロセスが問題のポートを取得できることに注意してくださいbind()。そうではない可能、もちろんですが、そのようなことが起こることもあります。処理が重要な場合は、これについて心配する必要があると思います。

一時ポートを使用しないか、プロセスが常に実行されるように設定しないことをお勧めします。inetadmプロセスを自動的に実行するサービスを構成するために使用されます。。これにより、inetdプロセスは常に「ユーザー」ポートにバインドされ、ユーザーが使用できるように効果的にスケジュールされます。

答え2

ポートを直接使用する以外に、ポートの使用を防ぐ方法はありません。私が思いついた一般的なアイデアは、バッチを次のように変更することです。

  1. 「ポートセーバー」スクリプトを終了します。

  2. 一般バッチ実行

  3. 新しい「ポートセーバー」スクリプトを開始

この回避策は助ける悪意のあるプロセスが目的のポートにバインドされるのを防ぎます。いいえバッチプロセスは終了しているように見えますが、ポートが解放されていない(すべてのプロセスを終了して)バッチプロセスによる驚きを防ぎます。

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);
}

そのポートを開いたまま無限ループを回すため、スクリプトのPIDを保存または検索して終了する必要があります。

関連情報