我有一个相当资源密集的perl cgi脚本(大约需要2秒钟才能完成)。只要最多只有4个或5个同时运行,通常情况就是如此。
问题是,当用户单击调用此脚本的链接时,会生成一个新进程来处理该连接请求,因此如果用户多次单击(如果他们不耐烦),则服务器会因新的问题而过载进程正在运行,其中大多数是冗余的。
如何确保每个主机只运行此进程的一个实例?
这是我正在维护的旧系统,它使用旧框架作为前端,我想尽可能避免使用javascript来禁用按钮客户端。将其转换为fast-cgi perl也是不可能的,因为这是一个旧系统,并且向apache添加fast-cgi可能会破坏此事运行的许多其他事情。
答案 0 :(得分:1)
您想要使用文件锁。阅读有关Fcntl模块和flock函数的文档:http://perldoc.perl.org/functions/flock.html
编辑以回应评论:
使用锁定文件的示例:
#!/usr/bin/perl
use strict;
use warnings;
use Fcntl qw(:flock);
local *FH;
my $opened_file = open(FH,'>/tmp/example_file.lck');
if ($opened_file) {
print "Lock file was opened successfully\n";
if (flock(FH, &LOCK_EX | &LOCK_NB)) {
&do_stuff();
} else {
print "Failed to get lock (another process is running)\n";
}
} else {
print "Failed to open lock file: $!\n";
}
close(FH);
sub do_stuff {
print "Locked!\n";
sleep 30; # Pretending to be busy for a long time
}