Запуск PHP-скрипта с помощью Upstart после перезагрузки

У меня есть следующий скрипт Upstart. Когда я запускаю следующую команду service worker-1 start, все работает отлично. Я вижу бегущих рабочих с ps aux | grep php. Я также могу использовать service worker-1 stop, который мне нужен для перезапуска/обновления рабочих процессов. Но к сожалению этот скрипт работает только частично при перезагрузке. Сценарий выполняется (начало: задание уже запущено: worker-1, когда я пытаюсь service worker-1 start), но я не вижу ни одного работающего воркера с ps aux | grep php и, конечно, service worker-1 stop возвращает stop: Unknown instance:. Вы хоть представляете, что может быть не так?

description "Starts/kills workers."
author "Jiri Mihal"
start on (started php5-fpm and started mysql)
stop on shutdown

pre-start script
    echo "[`date`] Workers started" >> /var/log/worker-1.log
    exec 2>>/var/log/worker-1.log
end script

post-start script
    echo $$ > /var/run/worker-1.pid
    for i in `seq 1 5`;
    do
        exec php /home/jiri/workers/dlapi.workers/workers/RpcWorkerLauncher.php Worker-1 >/dev/null 2>&1 &
    done
end script

post-stop script
    read -r FIRSTLINE < /var/run/worker-1.pid
    kill $(($FIRSTLINE + 2))
    kill $(($FIRSTLINE + 3))
    kill $(($FIRSTLINE + 4))
    kill $(($FIRSTLINE + 5))
    kill $(($FIRSTLINE + 6))
    rm /var/run/worker-1.pid
    echo "[`date`] Workers stopped" >> /var/log/worker-1.log
end script

person Jiri Mihal    schedule 21.12.2015    source источник
comment
Просто предположение, но при перезапуске я бы предположил, что пользователь, запускающий скрипт/службу запуска, не вы и, скорее всего, является пользователем root. Вы пытались запустить команду, используя sudo или даже su, чтобы получить root права и запустить ее.   -  person Jonathan Kuhn    schedule 21.12.2015
comment
Да, я пробовал, и я могу без проблем запускать вышеуказанные команды с помощью sudo. Я также могу запускать эти команды как пользователь root. Но я могу попробовать изменить путь из папки пользователя в какую-нибудь «системную» папку. Возможно, папка пользователя недоступна при запуске.   -  person Jiri Mihal    schedule 22.12.2015
comment
Попробуйте использовать что-то вроде этого (askubuntu.com/questions/20229/), чтобы переключить пользователя при загрузке на другого пользователя (себя) и запустить команду/службу запуска под этим пользователем.   -  person Jonathan Kuhn    schedule 22.12.2015
comment
@Mihi в качестве примечания: sudo функционально такой же, как пользователь root.   -  person Daemedeor    schedule 23.12.2015


Ответы (1)


Сценарий выше почти правильный. Основная проблема заключалась в том, что скрипт PHP инициировал рабочий процесс RabbitMQ, но сервер RabbitMQ не был готов.

Я сделал несколько дополнительных настроек, и вот рабочее решение:

description "Starts/kills workers."
author "Jiri Mihal"
start on (rabbitmq-server-running or started rabbitmq-server)
stop on (shutdown or rabbitmq-server-stopped or stopping rabbitmq-server)

env WORKER=Workername
env COUNT=5

pre-start script
    echo "[`date`] Workers started" >> /var/log/worker-$WORKER.log
end script

post-start script
    for i in `seq 1 $COUNT`;
    do
        exec php /home/jiri/workers/dlapi.workers/workers/RpcWorkerLauncher.php $WORKER >/dev/null 2>&1 &
        if [ $i = 1 ]; then
           echo $! > /var/run/worker-$WORKER.pid
        fi
    done
end script

post-stop script
    read -r PID < /var/run/worker-$WORKER.pid
    for i in `seq 1 $COUNT`;
    do
        kill $(($PID + $i - 1))
    done
    rm /var/run/worker-$WORKER.pid
    echo "[`date`] Workers stopped" >> /var/log/worker-$WORKER.log
end script
person Jiri Mihal    schedule 21.12.2015