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

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

我碰到如何防止PHP脚本不止一次运行? 这当然可以应用,但我想知道这是否可以在Perl中更好地完成。

例如,Perl有“清理在进程退出创build的临时文件”标志(File :: Temp :: CLEANUP),我相信触发,无论过程如何结束。 但是这个API只能用于创build具有随机名称的临时文件,所以它不能作为信号量的文件名。 我不明白如何删除文件的基本机制,但听起来像机制存在。 我将如何做一个命名文件,例如/ 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; } } 

可能想要以其他顺序做这些事情