2013-11-21 170 views
6

我有一個使用Apache2的mod_fastcgi服務方法的Perl Dancer Web應用程序。應用程序必須接受上傳的文件。當用戶上傳文件並按下停止按鈕時,fastcgi進程掛起,以100%運行,直到我手動終止進程。殺死長時間運行Fastcgi進程

是否有任何設置可以自動殺死掛起的進程?有沒有辦法自動殺死一段已經運行了一段時間的fastcgi進程?

+1

我認爲你需要了解爲什麼它被卡在首先是100%,如果是mod_fastcgi的錯誤或代碼。如果它是你的代碼,看看它在哪裏被卡住,如果它是mod_fastcgi的錯誤,在他們的網站上打開一個bug – nrathaus

回答

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; 
     } 
    } 
} 
2

不,這是不支持mod_fastcgi

這就是說,你有幾種選擇:

  • 裹基於超時的模塊在Perl代碼,比如Time::Out
  • 使用ulimit -t可讓內核在CPU配額結束後終止失控進程。

第二個解決方案實現起來有點難,因爲你不想殺死整個Apache進程。這在Unix StackExchange question中有更詳細的解釋。

+0

我沒有聽說過Time :: Out模塊,我在處理上傳過程。看起來「上傳」舞者功能並非是懸掛的部分,所以它一定是別的。 – mbergins