簡體   English   中英

在Centos上守護PHP腳本

[英]Daemonizing php script on Centos

在Centos Linux環境中嘗試守護PHP腳本時遇到一些問題。 不幸的是,Centos僅具有有限的守護程序功能,而沒有start-stop-daemon。

我正在嘗試創建一個可連續運行php腳本的服務,直到捕獲到信號為止。 我還希望一個php腳本也可以啟動該服務。

  • foolauncher.php通過系統啟動服務(“ service foo start”)
  • /etc/init.d/foo啟動foo.php
  • foo.php生成要守護的子進程,並退出父進程

但是,當我啟動foolauncher.php時,它顯示了啟動我的foo.php服務的init.d腳本,沒有釋放終端,而是輸出了我的系統調用。 當我發送SIGINT退出父級時,foo服務也會停止運行。

我知道問題的位置在foo.php中:

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

如果我忽略該行用於系統調用,則發送SIGINT退出父級不會影響foo服務。

我知道fclose(STDERR),fclose(STDOUT)和fclose(STDIN),但是我不確定在哪里實際關閉這些輸出,因為這似乎會引起與將SIGINT發送給父代類似的問題。 foo.php仍然在系統調用中死亡。

似乎是因為我正在向STDOUT輸出某些內容,所以父級無法完全釋放該子級...我不希望使用其他方法來進行守護進程(例如System Daemon,nohup)或使用cron作業來執行(即使我聽說守護php不是一個好主意),但可以解決此問題。

任何建議,建議或解決方案將不勝感激! 謝謝!

這些是文件:

foolauncher.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來使服務很好地進行守護進程

從foolauncher.php

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

似乎可以按照我的意願去做!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM