
매일 오전 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단계 사이 또는 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를 저장하거나 찾아서 종료해야 합니다.