특정 예약된 프로세스에 포트를 전용으로 할당하는 방법은 무엇입니까?

특정 예약된 프로세스에 포트를 전용으로 할당하는 방법은 무엇입니까?

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

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

답변1

포트 59070 예임시 포트- 하나는 다음 용도로 사용할 수 있습니다.나라를 떠나모든 프로세스에 대한 TCP 연결. (포트 59071도 마찬가지이므로 이는 실제로 좋은 해결 방법은 아닙니다...)

Solaris에서 임시 포트 범위는 다음으로 설정됩니다.tcp_smallest_anon_porttcp_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를 저장하거나 찾아 종료해야 합니다.

관련 정보