有幾種方法可以做到這一點,但我不確定哪一個是最好的。確保只有一個Perl程序實例正在運行的最佳方式是什麼?
這是我能想到的:
- 查找因此,使用pgrep的進程。
- 讓腳本使用flock鎖定自己,然後檢查每次運行時是否鎖定它。
- 在/var/run/program_name.pid中創建一個pid文件並檢查是否存在,並根據需要比較pid。
有可能有更多的方法來做到這一點。你認爲最好的方法是什麼?
有幾種方法可以做到這一點,但我不確定哪一個是最好的。確保只有一個Perl程序實例正在運行的最佳方式是什麼?
這是我能想到的:
有可能有更多的方法來做到這一點。你認爲最好的方法是什麼?
有很多方法可以做到這一點。 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";
一個優勢是,文件自動獲取解鎖程序退出時。以可靠的方式實施起來要容易得多。
做舊的PID文件技巧。
HTH
歡呼聲,
Rob
這可以通過從文件讀取PID並檢查過程是否仍然存在(使用kill 0,$ pid)來改進。如果不是,則忽略舊的pid文件並繼續。這有助於從崩潰的過程中更優雅地恢復。 – 2009-01-18 21:33:35
+1用於檢查在文件中找到的pid是否存在,用信號0終止存在。 – Keltia 2009-01-18 21:50:06
你列出的所有選項都很好。有一點需要注意的是,在極少數情況下,最終可能會有一個運行時間很長的進程(即停滯不前)。您可能想要考慮關注其他正在運行的實例運行了多長時間,並且可能會在超過一定時間(例如某天)時向您發送警報。
類似的問題,關於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