【问题标题】:How to prevent a Perl script from running more than once in parallel如何防止 Perl 脚本多次并行运行
【发布时间】:2015-02-10 13:13:13
【问题描述】:

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

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

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

或者有更好的方法吗?

【问题讨论】:

标签: linux perl semaphore


【解决方案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;
    }
}

可能想要以其他顺序执行这些操作

【讨论】:

    【解决方案2】:
    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__
    

    【讨论】:

    • 你把我难住了。这是什么__DATA__业务?
    • @JohannesErnst check perldoc.perl.org/perldata.html#Special-Literals DATA 之后的文本可以通过文件句柄 PACKNAME::DATA 读取,其中 PACKNAME 是当 DATA 令牌。文件句柄保持打开状态,指向 DATA 之后的行
    猜你喜欢
    • 2012-11-29
    • 1970-01-01
    • 2012-12-21
    • 2017-01-07
    • 2018-02-08
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2011-04-12
    相关资源
    最近更新 更多