linux — демонизирующий php-скрипт на Centos

Возникли проблемы с попыткой демонтировать php-скрипт в среде Centos Linux. К сожалению, Centos имеет только ограниченную функцию демона, а не start-stop-daemon …

Я пытаюсь создать сервис, который запускает скрипт php непрерывно, пока не будет пойман сигнал. Я также хотел бы, чтобы скрипт php запускал сервис.

  • foolauncher.php запускает сервис через систему («запуск сервиса»)
  • /etc/init.d/foo запускает foo.php
  • foo.php порождает дочерний процесс для демонизации и родительского выхода

Однако когда я запускаю foolauncher.php, он показывает скрипт init.d, запускающий мою службу foo.php, не освобождает терминал, а вместо этого выводит мой системный вызов. Когда я отправляю 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

1

Решение

Нашел решение!

Мне удалось заставить сервис красиво работать, просто перенаправив stdout и stderr в / dev / null

Из foolauncher.php

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

Кажется, делать то, что я хочу!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]