2017-10-13 50 views
1

我試圖用FCNTL庫在同一時間只能運行一個腳本實例,Perl的多服務器環境中使用FCNTL

它的工作原理,當它是誰運行腳本(同一臺服務器只能在一臺服務器」 t運行腳本的另一個實例),但如果我有另一個服務器(實際上訪問相同的文件系統)運行腳本,它不起作用(他可以實際運行它)。

任何人對如何處理這個使用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

相關問題