在Centos上对php脚本进行Daemonizing


Daemonizing php script on Centos

在Centos Linux环境中尝试守护php脚本时遇到一些问题。不幸的是,Centos只有有限的守护程序功能,而没有启动-停止守护程序。。。

我正在尝试创建一个服务,该服务持续运行php脚本,直到捕捉到信号为止。我还想要一个php脚本来启动该服务。

  • 万无一失.php通过系统启动服务("service foo start")
  • /etc/init.d/foo启动foo.php
  • foo.php生成要守护进程的子进程和父进程出口

然而,当我启动manlauncher.php时,它会显示init.d脚本启动我的foo.php服务,不会释放终端,而是输出我的系统调用。当我发送SIGINT退出父级时,foo服务也会停止运行。

我知道问题的位置在foo.php中:

$output = system('service foo status');

如果我在系统调用中省略了这一行,那么发送SIGINT退出父级不会影响foo服务。

我知道fclose(STDERR)、fclose;foo.php仍然类似地在系统调用中死亡。

似乎是因为我正在向STDOUT输出一些东西,所以家长无法完全释放孩子。。。我不想使用其他的去监控方法(如系统守护程序、nohup),也不想使用cron作业来执行(尽管我听说守护php不是一个好主意),而是一个如何解决这个问题的解决方案。

任何建议、建议或解决方案都将不胜感激!谢谢

以下是文件:

万无一失.php:

<?php
system('service foo start');

foo.php:

<?php
declare(ticks = 1);
$pid = pcntl_fork();
if ($pid < 0)
{
    system("echo 'failed to fork' >> /foo/foo.log");
    exit;
}
else if ($pid)
{
    system("echo 'parent exiting' >> /foo/foo.log");
    exit;
}
$sid = posix_setsid();
if ($sid < 0)
{
    exit;
}
pcntl_signal(SIGTERM, "signalHandler");
pcntl_signal(SIGINT, "signalHandler");
$daemonPid = posix_getpid();
system("echo 'Process started on $daemonPid!'n' >> /foo/foo.log");
system("echo $daemonPid > /var/run/foo.pid");
while(true)
{
    // If I dont have this line, everything daemonizes nicely
    $output = system("service foo status");
    system("echo 'In infinite loop still! $output'n' >> /foo/foo.log");
    sleep(3);
}
function signalHandler($signo)
{
    switch($signo)
    {
        case SIGTERM:
        {
            system("echo 'SIGTERM caught!'n' >> /foo/foo.log");
            exit();
        }
        case SIGINT:
        {
            system("echo 'SIGINT caught!'n' >> /foo/foo.log");
            exit();
        }
    }
}

/etc/init.d/foo

# Source function library.
. /etc/rc.d/init.d/functions
php=${PHP-/usr/bin/php}
foo=${FOO-/foo/foo.php}
prog=`/bin/basename $foo`
lockfile=${LOCKFILE-/var/lock/subsys/foo}
pidfile=${PIDFILE-/var/run/foo.pid}
RETVAL=0
start() {
    echo -n $"Starting $prog: "
    daemon --pidfile=${pidfile} ${php} ${foo}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch ${lockfile}
    return $RETVAL
}
stop() {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} ${prog}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}

rh_status() {
    status -p ${pidfile} ${foo}
}
# See how we were called.
case "$1" in
    start)
        rh_status >/dev/null 2>&1 && exit 0
        start
        ;;
    stop)
        stop
        ;;
    status)
        rh_status
        RETVAL=$?
        ;;
    restart)
        configtest -q || exit $RETVAL
        stop
        start
        ;;
    *)
        echo $"Usage: $prog {start|stop|restart|status}"
        RETVAL=2
esac
exit $RETVAL

找到了解决方案!

我只需将stdout和stderr重定向到/dev/null ,就可以很好地实现服务的守护进程

来自万无一失的.php

<?php
system('service foo start &> /dev/null');

似乎在做我想做的事!