2015-06-29 2 views
2

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

Я начал использовать /path/to/php /path/to/script/Insert.php & без проблем, а также может shell_exec("nohup /path/to/php /path/to/script/Insert.php >/dev/null &"). Я попытался использовать сценарий ниже, но сценарий не переходит в рабочее состояние.

Копирование файла на /etc/init.d/ и использование update-rc.d без проблем. Я могу использовать service congen-insert start, чтобы «запустить» скрипт, но он, похоже, не работает, и он не начинает выполнять какую-либо работу.

Что мне не хватает или где я ошибся со сценариями?

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

Любая помощь или предложения очень ценится! Если в моем описании есть что-то еще, что вам нужно или что-то, что я пропустил, сообщите мне, чтобы я мог его исправить.

Заранее спасибо.

Сервис скрипт

#! /bin/sh 
### BEGIN INIT INFO 
# Provides:   congen-insert 
# Required-Start: $local_fs $network 
# Required-Stop:  $local_fs 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: congen-insert 
# Description:  DB Insert Daemon 
### END INIT INFO 

NAME="congen-insert" 
DESC=" DB Insert Daemon" 
PIDFILE="/var/run/${NAME}.pid" 
LOGFILE="/var/log/${NAME}.log" 

DAEMON="/path/to/php" 
DAEMON_OPTS="/path/to/script/Insert.php" 

START_OPTS="--start --background --make-pidfile --pidfile ${PIDFILE} --exec ${DAEMON} ${DAEMON_OPTS}" 
STOP_OPTS="--stop --pidfile ${PIDFILE}" 

test -x $DAEMON || exit 0 

set -e 

case "$1" in 
    start) 
     echo -n "Starting ${DESC}: " 
     start-stop-daemon $START_OPTS >> $LOGFILE 
     echo "$NAME." 
     ;; 
    stop) 
     echo -n "Stopping $DESC: " 
     start-stop-daemon $STOP_OPTS 
     echo "$NAME." 
     rm -f $PIDFILE 
     ;; 
    restart|force-reload) 
     echo -n "Restarting $DESC: " 
     start-stop-daemon $STOP_OPTS 
     sleep 1 
     start-stop-daemon $START_OPTS >> $LOGFILE 
     echo "$NAME." 
     ;; 
    status) 
    echo -n "Sorry, this isn't implemented yet" 
    ;; 
    *) 
     N=/etc/init.d/$NAME 
     echo "Usage: $N {start|stop|restart|force-reload}" >&2 
     exit 1 
     ;; 
esac 

exit 0 

сценария Я пытаюсь запустить:

const LoaderPath = __DIR__ . DIRECTORY_SEPARATOR . ".." .DIRECTORY_SEPARATOR . "includes.php"; 

require_once LoaderPath; 

use PhpAmqpLib\Channel\AMQPChannel; 
use PhpAmqpLib\Message\AMQPMessage; 
use requests\InsertRequest; 

$connection = GetRabbitConnection(); 

$channel = $connection->channel(); 

$RedisClient = GetRedisClient(); 

DeclareQueues($connection, $RedisClient); 

$MySQLHost = $RedisClient->get(MySQLHostKey); 
$MySQLUser = $RedisClient->get(MySQLUserKey); 
$MySQLPassword = $RedisClient->get(MySQLPasswordKey); 
$MySQLDatabase = $RedisClient->get(MySQLDatabaseKey); 

$InsertExchange = $RedisClient->get(Insert.":".Exchange); 
$InsertQueue = $RedisClient->get(Insert.":".Queue); 
$Prefetch = $RedisClient->get(Insert.":".Prefetch); 

$RedisClient->disconnect(); 
$RedisClient = null; 

$mysql= new mysqli($MySQLHost, $MySQLUser, $MySQLPassword, $MySQLDatabase); 

$channel->basic_qos(0,$Prefetch,false); 

$channel->basic_consume($InsertQueue, $InsertExchange, false, false, false, false, "callback"); 


echo "Consuming on Exchange $InsertExchange with Queue $InsertQueue\n"; 

while(true) { 
    $channel->wait(); 
} 

$channel->close(); 

function callback(AMQPMessage $message){ 
    global $mysql; 
    echo "Message received", "\n"; 
    $InsertRequest = new InsertRequest($message->body); 

    echo "Running Insert Statement\n"; 
    if (!$mysql->query($InsertRequest->SQL)){ 
     echo "Error: ".$mysql->error; 
    } 

    /** @type AMQPChannel $channel */ 
    $channel = $message->delivery_info['channel']; 
    $channel->basic_ack($message->delivery_info['delivery_tag']); 
    echo "Insert Complete\n"; 

} 

ответ

1

Вопрос был в перенаправлении выхода. Я также изменил файл PHP с заголовком для Баша, так что не показывают, как несколько процессов PHP в верхней части, но показывает имя файла вместо:

пересмотренной Сценарий службы:

#! /bin/sh 

### BEGIN INIT INFO 
# Provides:   congen-insert 
# Required-Start: $local_fs $network 
# Required-Stop:  $local_fs 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: congen-insert 
# Description:  ConGen DB Insert Daemon 
### END INIT INFO 

NAME="congen-insert" 
DESC="DB Insert Process for ConGen" 
PIDFILE="/var/run/${NAME}.pid" 
LOGFILE="/var/log/${NAME}.log" 

DAEMON="/var/congen/php/controllers/congen-insert" 
DAEMON_OPTS="> /dev/null 2>&1" 

START_OPTS="--start --background --make-pidfile --pidfile ${PIDFILE} --exec ${DAEMON} ${DAEMON_OPTS}" 
STOP_OPTS="--stop --pidfile ${PIDFILE}" 

test -x $DAEMON || exit 0 

set -e 

case "$1" in 
    start) 
     echo -n "Starting ${DESC}: " 
     start-stop-daemon $START_OPTS >> $LOGFILE 
     echo "$NAME." 
     ;; 
    stop) 
     echo -n "Stopping $DESC: " 
     start-stop-daemon $STOP_OPTS 
     echo "$NAME." 
     rm -f $PIDFILE 
     ;; 
    restart|force-reload) 
     echo -n "Restarting $DESC: " 
     start-stop-daemon $STOP_OPTS 
     sleep 1 
     start-stop-daemon $START_OPTS >> $LOGFILE 
     echo "$NAME." 
     ;; 
    status) 
    echo -n "Sorry, this isn't implemented yet" 
    ;; 
    *) 
     N=/etc/init.d/$NAME 
     echo "Usage: $N {start|stop|restart|force-reload}" >&2 
     exit 1 
     ;; 
esac 

exit 0 

пересмотренную PHP Скрипт для запуска:

#!/php52/php-5.6.6/bin/php 
<?php 
    const LoaderPath = __DIR__ . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . "includes.php"; 

    require_once LoaderPath; 

    use PhpAmqpLib\Channel\AMQPChannel; 
    use PhpAmqpLib\Message\AMQPMessage; 
    use requests\InsertRequest; 

    $connection = GetRabbitConnection(); 

    $channel = $connection->channel(); 

    $RedisClient = GetRedisClient(); 

    DeclareQueues($connection, $RedisClient); 

    $InsertExchange = $RedisClient->get(Insert.":".Exchange); 
    $InsertQueue = $RedisClient->get(Insert.":".Queue); 
    $Prefetch = $RedisClient->get(Insert.":".Prefetch); 

    $RedisClient->disconnect(); 
    $RedisClient = null; 

    $mysql= ConnectionBuilder::GetMySQLi(); 

    $channel->basic_qos(0,$Prefetch,false); 

    $channel->basic_consume($InsertQueue, $InsertExchange, false, false, false, false, "callback"); 


    echo "Consuming on Exchange $InsertExchange with Queue $InsertQueue\n"; 

    while(true) { 
     $channel->wait(); 
    } 

    $channel->close(); 

    function callback(AMQPMessage $message){ 
     global $mysql; 
     echo "Message received", "\n"; 
     $InsertRequest = new InsertRequest($message->body); 

     echo "Running Insert Statement\n"; 
     if (!$mysql->query($InsertRequest->SQL)){ 
      echo "Error: ".$mysql->error; 
     } 

     /** @type AMQPChannel $channel */ 
     $channel = $message->delivery_info['channel']; 
     $channel->basic_ack($message->delivery_info['delivery_tag']); 
     echo "Insert Complete\n"; 

    } 

После добавления файла в /etc/init.d/ и сделать как PHP скрипт и сервис скрипт исполняемым, я могу запустить серв лед, используя service congen-insert start, и используйте остальные команды так же, как и любую другую службу init.d.

Следует отметить, что я перенаправляю консоль на /dev/null, но вы также можете перенаправить файл, заменив /dev/null доступным для записи способом.

Объяснение 2>&1 цитата из another SO post «2 это номер потока для Stderr (сообщений об ошибках), 1 это представляет [так] поток STDOUT (стандартный выходной поток без ошибок).» как таковой я в основном перенаправлением stdout к /dev/null и перенаправлять stderr к stdout

-1
  1. Написать скрипт, используя интерактивную оболочку команды для выполнения вашего PHP скрипт, как показано в php from terminal пример. Это работает только в том случае, если PHP скомпилирован для включения опции --with-readline

  2. Задайте задачу cron (планировщик задач linux), чтобы запустить этот скрипт, как показано в примере cron setup.

+0

Задача хрон не работает как сервис, т.е. обеспечение файл Pid, ​​работает на старте, делая перезагружается и т.д. демон должен действовать, как и любой другой демон или сервера извне. – ChaosAffe

+0

Вы можете установить сценарий для запуска при запуске системы: запуск при запуске; задача; exec/path/to/command; См. Более подробно на: http://askubuntu.com/questions/814/how-to-run-scripts-on-start-up – Zon

+0

Я отредактировал вопрос, чтобы уточнить. Я не ищу обходных решений, а понимал. Спасибо за ваш альтернативный метод, хотя – ChaosAffe

Смежные вопросы