php скрипт как сервис

Каким образом можно запустить php скрипт как сервис? Предлагаю два варианта реализации этой задачи на примере OS Gentoo и фреймворка laravel

Веб-мастер выдал нам следующую команду

artisan queue:listen --timeout=600 --tries=3

и попросил запустить ее как сервис. И как всякий сервис она должна запускаться после перегрузки сервера. Также должна быть возможность выполнить стоп/стар сервиса

Используем runscript

Создадим файл с именем myservice и положим его в /etc/init.d следующего содержания

start() {
 ebegin "Starting myservice"
 start-stop-daemon --start --user dtkt --background -- /usr/bin/php \
/home/site/www/artisan queue:listen --timeout=600 --tries=3
 eend $? "Failed to start myservice"
 }

stop() {
 ebegin "Stoping myservice"
 start-stop-daemon --stop --user dtkt --exec /usr/bin/php \
/home/site/www/artisan queue:listen
 eend $? "Failed to stop myservice"
 }

Проверяем

service myservice start
service myservice stop

Если все ОК загоняем его в start-up

rc-update add myservice default

Выполняем контрольную перегрузку сервера. Сервис должен подняться. Недостаток такого подхода-сервис может «падать». Поэтому рекомендуется второй вариант

Используем supervisor

Тоесть сервис смотрящий за другими сервисами и «поднимающий» их в случае «падения»

Устанавливаем

emerge supervisord

Конфиг supervisord.conf ищем в папке /etc и проводим первоначальную настройку

[unix_http_server]
file = /var/run/supervisord.sock ;
chmod = 0700 ; 

[supervisord]
logfile = /var/log/supervisor/supervisord.log ; 
logfile_maxbytes = 10MB
pidfile = /var/run/supervisord.pid ; 
childlogdir = /var/log/supervisor ; 

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisord.sock ; 

Далее непосредственно то, что касается нашего сервиса

[program:artisan_queue_listener]
directory=/home/site/www
command=/usr/bin/php artisan queue:listen --timeout=600 --tries=3
stdout_logfile=/var/log/supervisor/supervisord.log
redirect_stderr=true
autostart=true
autorestart=true
user=www
stopsignal=KILL
startsecs=3

Конфиг прост и интуитивно понятен. Запускаем

service supervisord start

Ошибки ловим в supervisord.log. Если таковых нет, то можем посмотреть статус супервизора

supervisorctl status

artisan_queue_listener RUNNING pid 21953, uptime 2 days, 17:23:15

Теперь надежно. Даже если сервис «упадет», то супервизор его «поднимет». Загоняем supervisord в start-up

rc-update add supervisord default

Все

Александр Черных

системный администратор

Статьи по теме