我有一个可能会运行很长时间的脚本。在Linux上。当它正在运行时,当由相同或不同的用户第二次调用时,它应该检测到并拒绝运行。我正在试图弄清楚如何创建一个合适的信号量,即使进程因某种原因而死也会被清理干净。
我遇到How to prevent PHP script running more than once?当然可以应用,但我想知道在Perl中是否可以做得更好。
例如,Perl具有“在进程退出时清理已创建的临时文件”标志(File :: Temp :: CLEANUP),我认为无论进程如何结束都会触发该标志。但是此API只能用于创建具有随机名称的临时文件,因此它不能用作信号量的文件名。我不明白文件如何被删除的基本机制,但听起来像机制存在。我如何为命名文件执行此操作,例如的/ var /运行/ foobar的?
或者有更好的方法吗?
答案 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;
}
}
可能希望以其他顺序执行