申し訳ありませんが、私はこの問題を解明しようとしています。私は手動で再起動するか、利用可能な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
私がやろうとしているのは、そのスクリプトを監視するために正しくコーディングされたシェルファイルを取得し、エラーのために終了した場合、またはスクリプトを再起動するために再起動を要求した場合です。
チェック[私の答え](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
それはトリックをやっていない、何かの理由で、それはphpのすべてのRAMを食べて、右に実行されない別の質問に示唆を使用しています。しかし、スクリプトを直接実行するとエラーは発生しません – amwdrizz