【问题标题】:Killing Long Running Fastcgi Processes杀死长时间运行的 Fastcgi 进程
【发布时间】:2013-11-21 17:40:35
【问题描述】:

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

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

【问题讨论】:

  • 我认为如果是 mod_fastcgi 的错误或您的代码,您需要先了解为什么它会卡在 100% 中。如果是你的代码,看看它卡在哪里,如果是 mod_fastcgi 的错,在他们的网站上打开一个错误

标签: perl fastcgi dancer


【解决方案1】:

不,mod_fastcgi不支持。

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

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

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

【讨论】:

  • 我没有听说过 Time::Out 模块,我围绕处理上传过程的代码部分对其进行了测试。看起来“上传”舞者功能不是挂着的部分,所以它一定是别的东西。
【解决方案2】:

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

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

所以我编写了一个简短的 perl 脚本,以 root 身份运行,以终止具有正确名称和年龄的 dancer 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;
        }   
    }   
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2011-01-05
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多