确保只有一个Perl程序实例正在运行的最佳方法是什么?

时间:2009-01-18 21:19:59

标签: perl process mutual-exclusion

有几种方法可以做到这一点,但我不确定哪一种方法最好。

这是我能想到的:

  • 使用pgrep查找进程。
  • 让脚本使用flock锁定自己,然后检查它是否在每次运行时都被锁定。
  • 在/var/run/program_name.pid中创建一个pid文件并检查是否存在,并在需要时比较pid。

可能有更多方法可以做到这一点。你认为最好的方法是什么?

3 个答案:

答案 0 :(得分:37)

有很多方法可以做到这一点。 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文件相比,一个优点是文件在程序退出时自动解锁。以可靠的方式实施起来要容易得多。

答案 1 :(得分:10)

执行旧的PID文件技巧。

  • 启动流程
  • 查看是否有名为“myprog.PID”的文件
  • 检查是否存在正在运行的proc。使用kill 0,$ pid
  • 匹配PID
  • 如果是PID proc的编号名称。比赛,大声抱怨并退出
  • 如果没有,请清理陈旧的“myprog.PID”
  • 创建一个名为“myprog.PID”的文件,然后继续

HTH

欢呼声,

罗布

答案 2 :(得分:2)

您列出的所有选项都很好。但有一点需要注意的是,在极少数情况下,你最终会遇到一个运行很长时间的过程(即等待某些东西)。您可能需要考虑关注其他正在运行的实例运行了多长时间,如果超过一定时间(例如某天),可能会发送警报。