簡體   English   中英

確保只有一個Perl程序實例正在運行的最佳方法是什么?

[英]What's the best way to make sure only one instance of a Perl program is running?

有幾種方法可以做到這一點,但我不確定哪一種是最好的。

這是我能想到的:

  • 使用pgrep查找進程。
  • 讓腳本使用flock鎖定自己,然后在每次運行時檢查它是否被鎖定。
  • 在/var/run/program_name.pid中創建一個pid文件並檢查是否存在,並在需要時比較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文件相比的一個優點是文件在程序退出時自動解鎖。 以可靠的方式實施起來要容易得多。

做舊的PID文件技巧。

  • 開始過程
  • 看看是否有一個名為“myprog.PID”的文件
  • 檢查是否存在正在運行的proc。 使用kill 0,$ pid匹配PID
  • 如果編程PID proc的名稱。 比賽,大聲抱怨並退出
  • 如果沒有,清理陳舊的“myprog.PID”
  • 創建一個名為“myprog.PID”的文件,然后繼續

HTH

干杯,

您列出的所有選項都很好。 但有一點需要注意的是,在極少數情況下,你最終可能會遇到一個運行很長時間的過程(即等待某些東西)。 您可能需要考慮關注其他正在運行的實例運行了多長時間,如果超過一定時間(例如某天),可能會發送警報。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM