杀死长期运行的Fastcgi进程

时间:2013-11-21 17:40:35

标签: perl fastcgi dancer

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

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

2 个答案:

答案 0 :(得分:2)

不,mod_fastcgi 不支持

那就是说,你有几种选择:

  • 将perl代码包装在基于超时的模块中,例如Time::Out
  • 使用ulimit -t让内核在CPU配额结束后终止失控进程。

第二种解决方案有点难以实现,因为你不想杀死整个apache进程。在Unix StackExchange question中详细解释了这一点。

答案 1 :(得分: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;
        }   
    }   
}