Я настроил Laravel Queue, используя базу данных, и настроил Supervisor, чтобы он продолжал работать, однако через некоторое время он останавливает обработку очереди.
я использую Mail::queue
отправлять электронные письма. Если я SSH в сервер и запустить php /home/my/path/to/artisan --env=production --timeout=240 queue:listen --tries=5
тогда все работает нормально и письма отправляют. Но, очевидно, я не хочу использовать SSH для обработки электронной почты, я хочу, чтобы очередь работала 24/7, поэтому я установил Supervisor для управления этим. Я отредактировал свой файл supervisord.conf, добавив в него следующую программу:
[program:laravel_queue]
command=php /home/my/path/to/artisan --env=production --timeout=240 queue:listen --tries=5
autostart=true
autorestart=true
logfile=/var/log/laraqueue.log
И когда я запускаю программу, она работает, мои письма отправляются. Однако через некоторое время (обычно на следующий день) электронные письма не отправляются. Я проверяю базу данных и таблица заданий заполняется. Когда я SSH в сервер и запускаю supervisorctl status
Я получил:
laravel_queue RUNNING pid 21081, uptime 2 days, 23:18:51
Он говорит 2 дня, так как работает в выходные и не работает сегодня (понедельник). Ясно, что он не работает, так как мне заставить диспетчер распознать, что он не работает, и перезапустить его?
Если я вручную перезапустить его с supervisorctl restart laravel_queue
потому что он не запущен, супервизор не может его остановить и просто зависает, пока я не нажму CTRL + C. В этот момент я получаю трассировку, которую я не понимаю:
Traceback (most recent call last):
File "/usr/bin/supervisorctl", line 6, in <module>
main()
File "/usr/lib/python2.6/site-packages/supervisor/supervisorctl.py", line 598, in main
c.onecmd(" ".join(options.args))
File "/usr/lib/python2.6/site-packages/supervisor/supervisorctl.py", line 86, in onecmd
return func(arg)
File "/usr/lib/python2.6/site-packages/supervisor/supervisorctl.py", line 467, in do_restart
self.do_stop(arg)
File "/usr/lib/python2.6/site-packages/supervisor/supervisorctl.py", line 433, in do_stop
result = supervisor.stopProcess(processname)
File "/usr/lib64/python2.6/xmlrpclib.py", line 1199, in __call__
return self.__send(self.__name, args)
File "/usr/lib64/python2.6/xmlrpclib.py", line 1489, in __request
verbose=self.__verbose
File "/usr/lib/python2.6/site-packages/supervisor/options.py", line 1309, in request
errcode, errmsg, headers = h.getreply()
File "/usr/lib64/python2.6/httplib.py", line 1064, in getreply
response = self._conn.getresponse()
File "/usr/lib64/python2.6/httplib.py", line 990, in getresponse
response.begin()
File "/usr/lib64/python2.6/httplib.py", line 391, in begin
version, status, reason = self._read_status()
File "/usr/lib64/python2.6/httplib.py", line 349, in _read_status
line = self.fp.readline()
File "/usr/lib64/python2.6/socket.py", line 433, in readline
data = recv(1)
KeyboardInterrupt
При повторной проверке состояния очередь останавливается, поэтому я запускаю supervisorctl start laravel_queue
и я получаю то же зависание, что и при запуске рестарта, но он начался, когда задания обрабатываются и отправляются электронные письма. Если я снова нажму CTRL + C, я получу ту же трассировку, что и выше.
Я проверил журнал ларка, оставив его на ночь. Я пытался отправить электронное письмо этим утром, и рабочий стол просто сидит там, ожидая обработки. В журнале просто полно этого:
X-Powered-By: PHP/5.6.10^M
Content-type: text/html; charset=UTF-8^M
^M
Вот и все. Просто много повторяется.
Я проверил журнал супервизора, и он просто сообщает об успешном запуске laravel_queue. Для завершения журнала:
2015-10-21 14:25:24,997 INFO /var/tmp/supervisor.sock:Medusa (V1.1.1.1) started at Wed Oct 21 14:25:24 2015
Hostname: <unix domain socket>
Port:/var/tmp/supervisor.sock
2015-10-21 14:25:25,099 CRIT Running without any HTTP authentication checking
2015-10-21 14:25:25,107 INFO daemonizing the process
2015-10-21 14:25:25,108 INFO supervisord started with pid 3407
2015-10-21 14:25:25,115 INFO spawned: 'laravel_queue' with pid 3409
2015-10-21 14:25:26,729 INFO success: laravel_queue entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
После обновления супервизора до последней версии у меня все та же проблема. Laraqueue.log имеет то же содержание, что и раньше, ничего полезного. Однако на этот раз в журнале супервизора есть немного больше:
2015-10-22 10:19:59,454 CRIT received SIGTERM indicating exit request
2015-10-22 10:19:59,454 INFO waiting for laravel_queue to die
2015-10-22 10:19:59,460 INFO stopped: laravel_queue (terminated by SIGTERM)
2015-10-22 10:19:59,460 INFO received SIGCLD indicating a child quit
2015-10-22 10:26:02,019 CRIT Supervisor running as root (no user in config file)
2015-10-22 10:26:02,085 CRIT Server 'inet_http_server' running without any HTTP authentication checking
2015-10-22 10:26:02,092 INFO daemonizing the supervisord process
2015-10-22 10:26:02,093 INFO supervisord started with pid 17268
2015-10-22 10:26:03,105 INFO spawned: 'laravel_queue' with pid 17269
2015-10-22 10:26:04,107 INFO success: laravel_queue entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2015-10-22 10:37:22,157 WARN received SIGTERM indicating exit request
2015-10-22 10:37:22,157 INFO waiting for laravel_queue to die
2015-10-22 10:37:22,163 INFO stopped: laravel_queue (terminated by SIGTERM)
Было несколько случаев супервизора, получающего запрос на выход и запускающего его обратно, и затем конец журнала находится выше, где он останавливает очередь, но по какой-то причине не запускает его снова. Я проверил журнал laravel (в хранилище / журналах), но в то время там ничего не было.
Проверьте, какая версия Supervisor у вас есть. Известно, что некоторые менеджеры пакетов забывают обновить Supervisor. Я думаю, что ваша проблема будет решена путем обновления Supervisor. Например v2.1 Supervisor с 2007 года и до сих пор в некоторых пакетах.
Текущая версия Supervisor — v3.13, хотя некоторые говорят (см. Ссылку внизу) v3 — последняя стабильная версия.
Проверьте, какую версию Supervisor вы используете
[root@test supervisor]# yum list | grep supervisor
Сравните версию с: https://pypi.python.org/pypi/supervisor
Снятие и установка (простая установка — это хорошо)
[root@test ~]$ yum remove supervisor
[root@test ~]$ wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | sudo python
[root@test ~]$ sudo easy_install supervisor
Searching for supervisor
Reading https://pypi.python.org/simple/supervisor/
Best match: supervisor 3.0
Обновить:
Пожалуйста, найдите время, чтобы посмотреть здесь, оно того стоит ( http://ahmed.amayem.com/running-a-node-js-app-ghost-in-the-background-continuously-with-supervisor-supervisord/ ). Несмотря на то, что он запускает node.js / ghost с Supervisor, я не думаю, что это имеет значение, так как это все о Supervisor!
Refs:
https://github.com/Supervisor/supervisor/issues/165
http://ahmed.amayem.com/woes-of-using-an-outdated-supervisord-to-run-a-node-js-app-ghost/
Других решений пока нет …