2017-10-13 5 views
1

내가 한 번에 스크립트의 하나의 인스턴스를 실행할 수 fcntl을 라이브러리를 사용하기 위해 노력하고있어,

은 '수 (같은 서버 스크립트를 실행하는 하나 개의 서버 때 의미가 있습니다 스크립트의 다른 인스턴스를 실행하지 마십시오.) 다른 (실제로 동일한 파일 시스템에 액세스하는 서버)이 스크립트를 실행하면 작동하지 않습니다 (그는 실행할 수 있습니다).

사람은이 사용은 fcntl 라이브러리를 처리하는 방법에 대한 아이디어를 가지고 (또는 다른?)를 사전에

감사합니다.

+0

Fcntl을 사용하여 스크립트의 인스턴스 하나를 어떻게 만듭니 까? – choroba

+0

https://blog.booking.com/highlander-daemons-without-daemons.html – choroba

+0

재현 할 수있는 예제를 제공해 주시겠습니까? '동일한 파일 시스템'이란 NFS 마운트를 의미합니까? NFS 잠금 관리자가 제대로 작동하는지 확인 했습니까? 원격 파일 잠금이 적용되지 않는 이유는 여러 가지입니다. 적어도 그들은 필수 사항이 아니라 임의의 것입니다. – Sobrique

답변

0

NFS를 통해 파일 잠금이 악명 높지만 악용 될 수 있습니다. 서버 인스턴스를 "잠금"이있는 서버에 대한 정보가 들어있는 네트워크 액세스 가능 파일로 조정하십시오.

... 
if (-f "/network/accessible/file.lock") { 
    open my $fh, '<', "/network/accessible/file.lock"; 
    my $lockholder = <$fh>; 
    die "Server lock held by $lockholder"; 

    # ... you could also examine $lockholder and verify that 
    #  the other server is still alive ... 
} else { 
    open my $fh, '>', "/network/accessible/file.lock"; 
    print $fh $ENV{HOSTNAME},":$$"; 
    close $fh; 
} 
... 

# need to remove the lock when the current server finishes 
END { unlink "/network/accessible/file.lock" } 

두 서버를 서로 밀리 초 내에 시작하지 않으면 충분합니다. 당신이 그것에 대해 편집증 적이라면, 서버가 생성 된 후 또는 프로그램 전체에서 주기적으로 잠금 파일을 읽게하여 잠금 파일 정보가 변경되지 않았는지 확인할 수 있습니다.

} else { 
    open my $fh, '>', "/network/accessible/file.lock"; 
    print $fh $ENV{HOSTNAME},":$$"; 
    close $fh; 

    sleep 1; 
    open $fh, '<', "/network/accessible/file.lock"; 
    my $lockholder = <$fh>; 
    if ($lockholder ne "$ENV{HOSTNAME}:$$") { 
     die "Server lock was stolen by $lockholder!"; 
    } 
} 
+0

고맙습니다. :) – gatemed