Каким образом можно запустить 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
Все

- Системный администратор с 2000 года
- Участник Freelancehunt, Хабр Q&A, cyberforum
- Кейсы