2009-01-18 68 views
23

有幾種方法可以做到這一點,但我不確定哪一個是最好的。確保只有一個Perl程序實例正在運行的最佳方式是什麼?

這是我能想到的:

  • 查找因此,使用pgrep的進程。
  • 讓腳本使用flock鎖定自己,然後檢查每次運行時是否鎖定它。
  • 在/var/run/program_name.pid中創建一個pid文件並檢查是否存在,並根據需要比較pid。

有可能有更多的方法來做到這一點。你認爲最好的方法是什麼?

+0

類似的問題,關於Bash相關的:http://stackoverflow.com/questions/455911/whats-the-best-way-to-make-sure-only-one-instance-of-a-perl-program-正在運行 – codeforester 2017-01-18 19:50:29

回答

34

有很多方法可以做到這一點。 PID文件是傳統的做法。你也可以對文件進行鎖定,例如程序本身。這一小段代碼將這樣的伎倆:

在PID文件
use Fcntl ':flock'; 
open my $self, '<', $0 or die "Couldn't open self: $!"; 
flock $self, LOCK_EX | LOCK_NB or die "This script is already running"; 

一個優勢是,文件自動獲取解鎖程序退出時。以可靠的方式實施起來要容易得多。

9

做舊的PID文件技巧。

  • 啓動過程
  • 看看是否有一個名爲「myprog.PID」
  • 如果是這樣的文件,大聲抱怨和退出
  • 如果沒有,創建一個名爲「myprog.PID」,然後文件繼續

HTH

歡呼聲,

Rob

+5

這可以通過從文件讀取PID並檢查過程是否仍然存在(使用kill 0,$ pid)來改進。如果不是,則忽略舊的pid文件並繼續。這有助於從崩潰的過程中更優雅地恢復。 – 2009-01-18 21:33:35

+0

+1用於檢查在文件中找到的pid是否存在,用信號0終止存在。 – Keltia 2009-01-18 21:50:06

2

你列出的所有選項都很好。有一點需要注意的是,在極少數情況下,最終可能會有一個運行時間很長的進程(即停滯不前)。您可能想要考慮關注其他正在運行的實例運行了多長時間,並且可能會在超過一定時間(例如某天)時向您發送警報。

相關問題