2011-01-31 12 views
1

申し訳ありませんが、私はこの問題を解明しようとしています。私は手動で再起動するか、利用可能なRAMがなくなるまで無期限にループするクラスを持っています。私は、CLIと通常のWebベースの実行の両方に準拠するようにコードを記述しました。唯一の違いは、Webベースの実行では、メモリの問題によりクラッシュするまで約12時間かかります。私がCLIで実行すると、はるかに長く実行されます(メモリによるクラッシュの前に平均4〜5日で)shでPHPでPHPを終了する

スクリプトは、私が必要とするもののために大きくカスタマイズされたIRCボットです。私は、クロスプラットフォームに準拠したものを作るためにC++、ルビー、Python、または他の言語について十分に知りません。私の開発マシンはWindowsで、私のプロダクションサーバーはUbuntuです。今、私はスクリプトを正常に終了し、ターミナルウィンドウから切り離すことができますので、スクリプトを終了することなくクローズできます。

しかし、私が理解しようとしているのは、エラーを捕捉し、自動的にスクリプトを再起動する方法です。私がチャネルからの再起動を要求してボットを再起動させた場合、新しいコード機能を追加しているか、一般的なバグ修正だけを追加しているかのように、最後のポジティブな方法があります。ここで

が実行されている私は、スクリプトを取得するには、それは私がターミナルに次の実行2台のサーバーの最大に接続されているために接続するサーバーに応じて、私のCLI開始PHPスクリプト

#!/usr/bin/php 
<?php 

include_once ("./config/base_conf.php"); 
include_once ("./libs/irc_base.php"); 

if ($config ['database'] == true) { 
    include_once ("./config/db_conf.php"); 
} 
$server = getopt ('s', array ("server::")); 

if (! $server) { 
    $SER = 'default_server'; 
} elseif ($server ['server'] == 'raelgun') { 
    $SER = 'server_a'; 
} else { 
    $SER = 'default_server'; 
} 

declare (ticks = 1) 
    ; 
$pid = pcntl_fork(); 
if ($pid == - 1) { 
    die ("could not fork"); 
} else if ($pid) { 
    exit(); // we are the parent 
} else { 
    // we are the child 
} 
// detatch from the controlling terminal 
if (posix_setsid() == - 1) { 
    die ("could not detach from terminal"); 
} 
$posid = posix_getpid(); 
$PID_FILE = "/var/run/bot_process_".$SER.".pid"; 
$fp = fopen ($PID_FILE , "w") or die("File Exists Process Running"); 
fwrite ($fp, $posid); 
fclose ($fp); 
// setup signal handlers 
pcntl_signal (SIGTERM, "sig_handler"); 
pcntl_signal (SIGHUP, "sig_handler"); 
// loop forever performing tasks 
$bot = new IRC_BOT ($config, $SER); 
function sig_handler($signo) { 
    switch ($signo) { 
     case SIGTERM : 
      $bot->machineKill(); 
      unlink($PID_FILE); 
      exit(); 
      break; 
     case SIGHUP : 
      $bot->machineKill(); 
      unlink($PID_FILE); 
      break; 
     default : 

     // handle all other signals 
    } 
} 

ある

php bot_start_shell.php --server="servernamehere" > /dev/null 

私がやろうとしているのは、そのスクリプトを監視するために正しくコーディングされたシェルファイルを取得し、エラーのために終了した場合、またはスクリプトを再起動するために再起動を要求した場合です。

+0

チェック[私の答え](http://stackoverflow.com/questions/4780247に降りてきます/非常によく似た質問](http://stackoverflow.com/questions/4780247/restart-a-php-script-using-shell)上で/再起動-a-php-script-using-shell-script/4780328#4780328) -script)それはまた、ここでもトリックを参照してください:) – sarnold

+0

それはトリックをやっていない、何かの理由で、それはphpのすべてのRAMを食べて、右に実行されない別の質問に示唆を使用しています。しかし、スクリプトを直接実行するとエラーは発生しません – amwdrizz

答えて

2

私はしばらくの間、シェルスクリプトがPHPスクリプトを実行し、終了値を監視して再起動します。

exit()を使用してシェルスクリプトに値を返すテストスクリプト-95,96 & 100は、スクリプトの最後で処理される他の「計画外の再起動」とみなされます。

#!/usr/bin/php 
<?php 
// cli-script.php 
// for testing of the BASH script 
exit (rand(95, 100)); 

/* normally we would return one of 
# 97 - planned pause/restart 
# 98 - planned restart 
# 99 - planned stop, exit. 
# anything else is an unplanned restart 
*/ 

私は、スクリプトを再起動する前に、数秒待つように呼び出されるスクリプトが即座に失敗した場合、CPUの浪費を回避するために、そしてその直後に再起動されるだろう好みます。

#!/bin/bash 

# runPHP-Worker.sh 

# a shell script that keeps looping until an exit code is given 
# if its does an exit(0), restart after a second - or if it's a declared error 
# if we've restarted in a planned fashion, we don't bother with any pause 
# and for one particular code, we can exit the script entirely. 
# The numbers 97, 98, 99 must match what is returned from the PHP script 

nice php -q -f ./cli-script.php -- [email protected] 
ERR=$? 

## Possibilities 
# 97 - planned pause/restart 
# 98 - planned restart 
# 99 - planned stop, exit. 
# 0  - unplanned restart (as returned by "exit;") 
#  - Anything else is also unplanned paused/restart 

if [ $ERR -eq 97 ] 
then 
    # a planned pause, then restart 
    echo "97: PLANNED_PAUSE - wait 1"; 
    sleep 1; 
    exec $0 [email protected]; 
fi 

if [ $ERR -eq 98 ] 
then 
    # a planned restart - instantly 
    echo "98: PLANNED_RESTART, no pause"; 
    exec $0 [email protected]; 
fi 

if [ $ERR -eq 99 ] 
then 
    # planned complete exit 
    echo "99: PLANNED_SHUTDOWN"; 
    exit 0; 
fi 

# unplanned exit, pause, and then restart 
echo "unplanned restart: err:" $ERR; 
echo "sleeping for 1 sec" 
sleep 1 

exec $0 [email protected] 

あなたが値ごとに異なることを行うにはしたくない場合は、それは本当にただ

#!/bin/bash 
php -q -f ./cli-script.php -- [email protected] 
exec $0 [email protected]; 
関連する問題