如何防止Perl脚本并行运行多次

时间:2014-12-11 22:02:18

标签: linux perl semaphore

我有一个可能会运行很长时间的脚本。在Linux上。当它正在运行时,当由相同或不同的用户第二次调用时,它应该检测到并拒绝运行。我正在试图弄清楚如何创建一个合适的信号量,即使进程因某种原因而死也会被清理干净。

我遇到How to prevent PHP script running more than once?当然可以应用,但我想知道在Perl中是否可以做得更好。

例如,Perl具有“在进程退出时清理已创建的临时文件”标志(File :: Temp :: CLEANUP),我认为无论进程如何结束都会触发该标志。但是此API只能用于创建具有随机名称的临时文件,因此它不能用作信号量的文件名。我不明白文件如何被删除的基本机制,但听起来像机制存在。我如何为命名文件执行此操作,例如的/ var /运行/ foobar的?

或者有更好的方法吗?

2 个答案:

答案 0 :(得分:6)

use strict;
use warnings;
use Fcntl ':flock';

flock(DATA, LOCK_EX|LOCK_NB) or die "There can be only one! [$0]";


# mandatory line, flocking depends on DATA file handle
__DATA__

答案 1 :(得分:1)

一种方法是将pid放入文件中,然后您可以让脚本检查正在运行的进程。

open(my $fh, '>', '/var/run/foobar');
print $fh "$$\n";
close $fh;

然后您可以阅读:

if (open(my $fh, '<', '/var/run/foobar')) {
    while (my $PID = <$fh>) {
        chomp $PID;
        $proc = `ps hp $PID -o %c`;
        if ($proc eq "foobar"){
            exit();
        }
        break;
    }
}

可能希望以其他顺序执行