我試圖用FCNTL庫在同一時間只能運行一個腳本實例,Perl的多服務器環境中使用FCNTL
它的工作原理,當它是誰運行腳本(同一臺服務器只能在一臺服務器」 t運行腳本的另一個實例),但如果我有另一個服務器(實際上訪問相同的文件系統)運行腳本,它不起作用(他可以實際運行它)。
任何人對如何處理這個使用FCNTL庫的想法(或其他?)提前
感謝。
我試圖用FCNTL庫在同一時間只能運行一個腳本實例,Perl的多服務器環境中使用FCNTL
它的工作原理,當它是誰運行腳本(同一臺服務器只能在一臺服務器」 t運行腳本的另一個實例),但如果我有另一個服務器(實際上訪問相同的文件系統)運行腳本,它不起作用(他可以實際運行它)。
任何人對如何處理這個使用FCNTL庫的想法(或其他?)提前
感謝。
文件鎖定在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!";
}
}
感謝這工作:) – gatemed
你如何使用Fcntl來運行腳本的一個實例? – choroba
https://blog.booking.com/highlander-daemons-without-daemons.html – choroba
您能舉一個可重現的例子嗎? 「相同的文件系統」是否意味着NFS被掛載?你有沒有檢查你的NFS鎖經理工作正常?有很多原因可能導致遠程文件鎖不能被使用。尤其是因爲 - 他們是自由裁量的,而不是強制性的。 – Sobrique