perl通過檔案鎖讓指令碼單一實例運行

來源:互聯網
上載者:User

原文地址:http://blogread.cn/it/article/743?f=wb

 

用Perl寫了一些監控指令碼,放在crontab中調度執行。有時候會發現一個指令碼已耗用時間過長,會同時跑起多個執行個體,因此有必要為指令碼加上控制,只運行一個執行個體。

最簡單自然的想法,在指令碼中檢查並建立一個空的lock檔案,指令碼結束時再刪除。通過判斷檔案是否存在的方式來判斷指令碼是否已經運行。不過這樣做有個bug,如果指令碼運行過程中異常終止,lock檔案沒有正常刪除,就會導致指令碼無法再運行。

空的lock檔案不行,那麼考慮在lock檔案中加入一點內容,比如進程的PID號,然後通過檢查該PID號的進程是否還在運行,就能避免上述bug了。在CPAN上有很多現成的模組能夠完成上述功能,如File::Lockfile, File::Pid, Proc::PID::File 等。

下面是File::Lockfile的一個樣本,非常簡單:

以下是程式碼片段:

 

01 #!/usr/bin/perl -w 
02 useFile::Lockfile;
03 # lock檔案位於/tmp目錄,名為test_file_lock.lck 
04 my $lockfile= File::Lockfile->new(’test_file_lock’,’/tmp’);
05 # 檢查指令碼是否已經運行,如已運行則退出 
06 if ( my $pid= $lockfile->check ) {
07   print"program is already running with PID: $pid";
08   exit; 
09
10 #更新lock檔案 
11 $lockfile->write; 
12 # 指令碼邏輯 
13 sleep30
14 #刪除lock檔案 
15 $lockfile->remove;

 

通過查看File/Lockfile.pm的原始碼可以看到,判斷lock檔案中記錄的進程是否已經運行,簡單的通過 kill -0 $pid 即可實現。所以即使不用上述模組,自己實現也是非常容易的。

小結:

該方法是在指令碼中經常用到限制單一實例的方法,MySQL 等程式在每次啟動前也會檢查上次遺留的 mysql.pid 檔案。

另一個方法:給lock檔案加排它鎖,判斷是否有鎖來確保唯一性。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.