특정 예약된 프로세스 전용 포트를 만드는 방법은 무엇입니까?

특정 예약된 프로세스 전용 포트를 만드는 방법은 무엇입니까?

매일 오전 2시에 시작되는 XYZ 배치 프로세스가 있습니다. 이 XYZ는 포트 59070에서 시작하도록 구성됩니다. 완료되면 이 포트는 열린 포트가 됩니다. 그러나 최근에 다른 프로세스가 59070을 사용하고 있었고 이 XYZ 프로세스가 시작되었을 때 실행에 실패하는 문제가 발생했습니다.

해결 방법으로 구성을 다른 포트 59071로 업데이트하고 프로세스를 정상적으로 실행했습니다. 내 질문은 어쨌든 이 포트 59070을 차단하고 다른 프로세스가 이 포트를 사용하지 않도록 할 수 있다는 것입니다. 우리는 솔라리스 10을 사용하고 있습니다.

답변1

포트 59070은임시 포트- 다음 용도로 사용할 수 있는 것배 밖으로모든 프로세스에 의한 TCP 연결. (포트 59071과 마찬가지로 이는 실제로 좋은 해결 방법은 아닙니다...)

Solaris에서 임시 포트 범위는 다음으로 설정됩니다.tcp_smallest_anon_port와 그tcp_largest_anon_port조정 가능한 매개변수. 기본 범위는 32,768~65,535입니다. 해당 범위의 모든 포트가 사용 중일 수 있습니다.언제든지나가는 TCP 연결을 통해.

@Jeff Schaller의 답변에 명시된 바와 같이 포트는 선착순으로 사용되므로 포트를 "예약"하는 유일한 방법은 항상 무언가를 바인딩하는 것입니다. 그 답변에서 "포트 보호기" 스크립트를 종료하는 것과 실제로 포트를 사용하는 "일반" 프로세스 사이에 다른 프로세스가 문제의 포트를 확보할 수 있다는 점에 유의하십시오 bind(). 그렇지 않다~할 것 같은, 물론이지만 그런 일이 일어날 수도 있습니다. 처리가 중요한 경우에는 이에 대해 걱정해야 한다고 생각합니다.

임시 포트를 사용하지 않거나 프로세스가 항상 실행되도록 구성하지 않는 것이 좋습니다.inetadm프로세스를 자동으로 실행하는 서비스를 구성하는 데 사용. 그러면 inetd프로세스가 항상 "귀하의" 포트에 바인딩되어 효과적으로 사용할 수 있도록 예약 됩니다 .

답변2

포트를 직접 사용하는 것 외에는 포트 사용을 차단하는 방법을 모르겠습니다. 제가 제안할 일반적인 아이디어는 일괄 처리를 다음과 같이 변경하는 것입니다.

  1. "포트 보호기" 스크립트를 종료하세요

  2. 일반 일괄 처리 실행

  3. 새로운 "포트 보호기" 스크립트를 시작하세요

이 해결 방법은돕다불량 프로세스가 원하는 포트에 바인딩되는 것을 방지합니다(프로세스가 1단계와 2단계 사이 또는 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를 저장하거나 찾아서 종료해야 합니다.

관련 정보