我有一个Perl Dancer Web应用程序,它使用Apache2的mod_fastcgi服务方法。应用程序必须接受上传的文件。当用户上传文件并按下停止按钮时,fastcgi进程将挂起,以100%运行,直到我手动终止该进程。
是否有任何设置可以自动终止像这样挂起的进程?有没有办法自动杀死已经运行了一段时间的fastcgi进程?
答案 0 :(得分:2)
不,mod_fastcgi
不支持。
那就是说,你有几种选择:
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;
}
}
}