繁体   English   中英

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

[英]How to prevent a Perl script from running more than once in parallel

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

我遇到了如何防止PHP脚本多次运行? 这当然可以应用,但我想知道这是否可以在Perl中做得更好。

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

或者有更好的方法吗?

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__

一种方法是将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;
    }
}

可能想以其他顺序进行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM