Shell 通过sh捕获CLI中的PHP出口

Shell 通过sh捕获CLI中的PHP出口,shell,php,Shell,Php,好的,我正在努力解决这个问题。我有一个类,它会无限期地循环,直到我手动重新启动它或者它的可用ram用完为止。我已经编写了符合CLI和基于web的正常执行的代码。唯一的区别是基于web的执行脚本将持续大约12个小时,直到由于内存问题而崩溃。当我在CLI中运行它时,它运行的时间要长得多(平均在内存崩溃前4-5天) 这个脚本是一个IRC机器人,它是为我需要它做的事情而定制的。我不太了解C++、Ruby、Python或其他语言,以使其成为跨平台兼容的东西。我的开发机器是Windows,生产服务器是Ubu

好的,我正在努力解决这个问题。我有一个类,它会无限期地循环,直到我手动重新启动它或者它的可用ram用完为止。我已经编写了符合CLI和基于web的正常执行的代码。唯一的区别是基于web的执行脚本将持续大约12个小时,直到由于内存问题而崩溃。当我在CLI中运行它时,它运行的时间要长得多(平均在内存崩溃前4-5天)

这个脚本是一个IRC机器人,它是为我需要它做的事情而定制的。我不太了解C++、Ruby、Python或其他语言,以使其成为跨平台兼容的东西。我的开发机器是Windows,生产服务器是Ubuntu。现在,我已经成功地将脚本从终端窗口分叉并分离,这样我就可以在不结束脚本的情况下关闭它

但我想弄清楚的是如何捕捉错误并自动重启脚本,因为它往往在随机时间失败,而不是在我在IRC通道捕捉失败时总是失败。最后一个积极的方面是,如果我请求从通道重新启动,并在我不断添加新代码函数或只是一般错误修复时让bot重新启动,那么就可以捕获

这是我的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
    }
}

因此,我试图做的是获得一个正确编码的shell文件来监视该脚本,以及它是否由于错误而退出或请求重新启动以重新启动脚本。

我已经使用此技术一段时间了,其中shell脚本运行PHP脚本,监视退出值并重新启动

#!/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
*/
下面是一个测试脚本,它使用exit()向shell脚本返回一个值-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
*/
如果你不想为每一个值做不同的事情,那就归结为

#!/bin/bash
php -q -f ./cli-script.php -- $@
exec $0 $@;

检查a,看看它在这里是否也起到了作用:)这不起作用,出于某种原因,使用另一个问题中的建议,它会占用php的所有ram,并且运行不正常。但是直接运行脚本,我不会得到这些错误
#!/bin/bash
php -q -f ./cli-script.php -- $@
exec $0 $@;