毎日午前2時に開始するXYZバッチプロセスがあります。この XYZ はポート 59070 から開始するように構成されます。完了すると、このポートはオープンポートになります。しかし、最近問題が発生しました。他のプロセスは59070を使用しており、このXYZプロセスが開始されたときに実行に失敗しました。
回避策として、設定を別のポート59071に更新し、プロセスを正常に実行しました。私の質問は、このポート59070をブロックし、他のプロセスがこのポートを使用しないようにすることができるかどうかです。私たちはSolaris 10を使用しています。
答え1
ポート 59070 はい一時ポート- 1つは次の目的に使用できます。国を離れるすべてのプロセスへのTCP接続。 (ポート59071も同様なので、これは実際には良い解決策ではありません...)
Solarisでは、一時ポート範囲は次のように設定されます。とtcp_smallest_anon_port
tcp_largest_anon_port
調整可能なパラメーター。デフォルトの範囲は32,768〜65,535です。この範囲のすべてのポートがビジーである可能性があります。いつでも発信TCP接続を介して。
@Jeff Schallerの答えによると、ポートは先着順に使用されるため、ポートを「予約」する唯一の方法は、常にポートに何かをバインドすることです。その答えで、「ポートセーバー」スクリプトを終了することと、実際にポートを使用している「一般」プロセスの間に他のプロセスが問題のポートを取得できることに注意してくださいbind()
。そうではない可能、もちろんですが、そのようなことが起こることもあります。処理が重要な場合は、これについて心配する必要があると思います。
一時ポートを使用しないか、プロセスが常に実行されるように設定しないことをお勧めします。inetadm
プロセスを自動的に実行するサービスを構成するために使用されます。。これにより、inetd
プロセスは常に「ユーザー」ポートにバインドされ、ユーザーが使用できるように効果的にスケジュールされます。
答え2
ポートを直接使用する以外に、ポートの使用を防ぐ方法はありません。私が思いついた一般的なアイデアは、バッチを次のように変更することです。
「ポートセーバー」スクリプトを終了します。
一般バッチ実行
新しい「ポートセーバー」スクリプトを開始
この回避策は助ける悪意のあるプロセスが目的のポートにバインドされるのを防ぎます。いいえバッチプロセスは終了しているように見えますが、ポートが解放されていない(すべてのプロセスを終了して)バッチプロセスによる驚きを防ぎます。
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を保存または検索して終了する必要があります。