web-dev-qa-db-ja.com

Laravelスーパーバイザー付きキュー、実行中ですがジョブを処理していません

Laravelデータベースを使用してキューを設定し、スーパーバイザーを実行し続けるように構成しましたが、しばらくするとキューの処理が停止します。

電子メールの送信にMail::queueを使用しています。サーバーにSSH接続してphp /home/my/path/to/artisan --env=production --timeout=240 queue:listen --tries=5を実行すると、正常に機能し、電子メールが送信されます。しかし、明らかに、電子メールを処理するためにSSHで接続する必要はありません。キューを24時間年中無休で実行したいので、これを管理するためにスーパーバイザーをインストールしました。私は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

プログラムを開始すると、メールが送信されます。ただし、しばらくすると(通常は翌日)、電子メールは送信されません。データベースを確認すると、jobsテーブルがいっぱいになっています。サーバーに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を押すと、上記と同じトレースバックが得られます。

ログ

一晩放置した後、laraqueueログを確認しました。今朝メールを送ろうとしたところ、ジョブテーブルが処理待ちの状態になっています。ログはちょうどこれでいっぱいです:

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)

スーパーバイザが終了要求を受信して​​それを再起動するインスタンスが2つありました。その後、ログの最後は、キューを停止する場所の上にありますが、なんらかの理由で再起動しません。 laravel log(in storage/logs))を確認しましたが、その頃は何もありませんでした。

21
Styphon

お持ちのスーパーバイザのバージョンを確認してください。一部のパッケージマネージャーは、スーパーバイザーの更新を忘れることがわかっています。スーパーバイザーをアップデートすることで問題は解決すると思います。たとえば、スーパーバイザのv2.1は2007年のものであり、まだいくつかのパッケージに含まれています。

スーパーバイザの現在のバージョンはv3.13ですが、一部のユーザーは(下部の参照を参照)v3が最後の安定バージョンであると言います。

使用しているスーパーバイザのバージョンを確認してください

[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を実行していますが、これはすべてスーパーバイザに関するものなので、重要ではないと思います!

参照: https://github.com/Supervisor/supervisor/issues/165

http://ahmed.amayem.com/running-a-node-js-app-ghost-in-the-background-continuously-with-supervisor-supervisord/

http://ahmed.amayem.com/woes-of-using-an-outdated-supervisord-to-run-a-node-js-app-ghost/

3
NickNo

古いことはわかっていますが、約2週間前にまったく同じ問題が発生し、修正しました。 (ここではスーパーバイザー3.0)私のキューの問題は1人のワーカーのみでした。さらに2人のワーカーを追加してcofigファイルを再読み取り/更新すると、すべてが魅力のように機能します。だから労働者の数を変更してみてください-これはあなたを助けるかもしれません。

0
Milena Schmidt