[英]Why are files copied to mounted folder from inside the container not appearing in the host folder?
[英]Detecting that files are being copied in a folder
我正在運行一個腳本,如果它不存在(或不一致),則從特定位置復制一個文件夾。 當我多次運行腳本2次以上時會出現問題。 當第一個腳本試圖復制文件時,第二個腳本會嘗試同樣的事情導致一團糟。 我怎么能避免這種情況? 類似於系統范圍的互斥體。
我用-w
嘗試了一個簡單的測試,我手動復制了文件夾,當文件夾復制時我運行腳本:
use strict;
use warnings;
my $filename = 'd:\\folder_to_copy';
if (-w $filename) {
print "i can write to the file\n";
} else {
print "yikes, i can't write to the file!\n";
}
當然這不起作用,因為我仍然有寫入該文件夾的訪問權限。 任何想法如何檢查文件夾是否在Perl
中復制或使用batch commands
?
聽起來像鎖文件的工作 。 有無數的CPAN模塊可以實現鎖定文件,但大多數都不能在Windows上運行。 根據CPAN測試人員,以下是一些似乎支持Windows的方法:
在快速查看源代碼后,我可以推薦的唯一模塊是File :: Flock :: Tiny 。 其他人似乎很生氣。
如果你需要一個系統范圍的互斥鎖,那么一個“技巧”是(ab)使用一個目錄。 命令mkdir
通常是原子的,可以工作也可以不工作(如果目錄已經存在)。
更改腳本如下:
my $mutex_dir = '/tmp/my-mutex-dir';
if ( mkdir $mutex_dir ) {
# run your copy-code here
# when finished:
rmdir $mutex_dir;
} else {
print "another instance is already running.\n";
}
您唯一需要確保的是,您可以在/tmp
(或其中)創建目錄。
請注意,我故意不首先測試$mutex_dir
的存在,因為在if (not -d $mutex_dir)
和mkdir
其他人可以創建目錄,而mkdir
無論如何都會失敗。 所以簡單地調用mkdir
。 如果它工作,那么你可以做你的東西。 完成后不要忘記刪除$mutex_dir
。
這也是這種方法的缺點:如果您的復制代碼崩潰並且腳本過早死亡,那么該目錄不會被刪除。 據推測,在nwellnhof的答案中建議的鎖定文件機制在這種情況下表現得更好,並自動解鎖文件。
當第一個腳本試圖復制文件時,第二個腳本會嘗試同樣的事情導致一團糟
最簡單的方法是創建一個文件,如果另一個腳本實例正在運行,該文件將包含1。 然后,您可以添加條件。
{local $/; open my $fh, "<", 'flag' or die $!; $data = <$fh>};
die "another instance of script is running" if $data == 1;
另一種方法是在腳本中設置環境變量並在BEGIN
塊中檢查它。
您可以使用包http://search.cpan.org/~cjm/Win32-IPC-1.11/的 Windows-Mutex或Windows-Semaphore對象
use Win32::Mutex;
use Digest::MD5 qw (md5_hex);
my $mutex = Win32::Mutex->new(0, md5_hex $filename);
if ($mutex) {
do_your_job();
$mutex->release
} else {
#fail...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.