6

我有一个 Perl Dancer Web 应用程序,它使用 Apache2 的 mod_fastcgi 服务方法。应用程序必须接受上传的文件。当用户上传文件并按下停止按钮时,fastcgi 进程挂起,以 100% 的速度运行,直到我手动终止该进程。

是否有任何设置可以自动杀死像这样挂起的进程?有没有办法自动杀死已经运行了一段时间的 fastcgi 进程?

4

2 回答 2

2

不,它不受.mod_fastcgi

也就是说,您有几种选择:

  • 将您的 perl 代码包装在基于超时的模块中,例如Time::Out
  • ulimit -t一旦他的 CPU 配额结束,用于让内核杀死失控的进程。

第二种解决方案实施起来有些困难,因为您不想杀死整个 apache 进程。在Unix StackExchange question中有更详细的解释。

于 2013-12-07T15:26:23.450 回答
0

由于我感兴趣的功能不是 mod_fastcgi 的选项,而且我似乎找不到要在 Time::Out 中包装的代码部分来终止进程。我想我会分享我被黑的解决方案。

我搜索了一个 linux 命令来执行此操作,但 killall 不起作用(它不会专门找到运行该服务器实例的 perl 命令)并且 pkill 也没有(无法指定进程的年龄杀)。

所以我写了一个简短的 perl 脚本,它以 root 身份运行,以终止具有正确名称和年龄的舞者 mod_fastcgi 服务器实例的作业:

#!/usr/bin/perl -w

use Proc::ProcessTable;

$t = new Proc::ProcessTable( 'cache_ttys' => 1 );  

foreach $p ( @{$t->table} ){
    if ($p->cmndline =~ /perl.*dispatch.fcgi/) {
        my $run_time_min = $p->time/(1000000*60);
        if ($run_time_min >= 15) {
            # print "Found this job to kill: ". $p->pid . $p->cmndline."\n". $run_time_min . "\n";
            kill 'KILL', $p->pid;
        }   
    }   
}
于 2013-12-08T18:20:35.790 回答