Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 21, 2015 19:49:52

inozemcev
Зарегистрирован: 2015-04-25
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Демонизировать торнадо процесс

Есть торнадо приложение которое обслуживает игру:

import signal
import time
import tornado.httpserver
import tornado.ioloop as loop
from django.core.management.base import BaseCommand, CommandError
#from privatemessages.tornadoapp import application
import logging
logger = logging.getLogger('tornado_commander')
from game.tornado.lobby import MainHandler, LobbyHandler, GrahhHandler, GrahhApiHandler
from game.tornado.match import MatchHandler
class Command(BaseCommand):
    args = '[port_number]'
    help = 'Starts the Tornado application for message handling.'
    def sig_handler(self, sig, frame):
        """Catch signal and init callback"""
        tornado.ioloop.IOLoop.instance().add_callback(self.shutdown)
    def shutdown(self):
        """Stop server and add callback to stop i/o loop"""
        self.http_server.stop()
        msg = 'Tornado Launcher. IOLoop.instance stop'
        logger.debug(msg)
        io_loop = tornado.ioloop.IOLoop.instance()
        io_loop.add_timeout(time.time() + 2, io_loop.stop)
    def handle(self, *args, **options):
        urls = [
            (r'/(?P<apikey>.+)/', MainHandler),
            (r'/lobby', LobbyHandler),
            (r'/match/([0-9]+)', MatchHandler),
            (r'/crossdomain.xml', GrahhHandler),
             (r'/api/crossdomain.xml', GrahhApiHandler)
        ]
        app = tornado.web.Application(urls)
        port = 8003
        address =  "5.101.123.195"
        self.http_server = tornado.httpserver.HTTPServer(app)
        self.http_server.listen(port, address=address)
        #pool = tornadoredis.ConnectionPool(host=address, port=8003)
        #c = tornadoredis.Client(connection_pool=pool)
        #c.connect()
        #c.psubscribe("*", lambda msg: c.listen(ThreadHandler.pubsub_message))
        # Init signals handler
        signal.signal(signal.SIGTERM, self.sig_handler)
        # This will also catch KeyboardInterrupt exception
        signal.signal(signal.SIGINT, self.sig_handler)
        msg = 'Tornado Launcher. IOLoop.instance start'
        logger.debug(msg)
		
        loop.IOLoop.instance().start()

При попытке сделать этот процесс демоном:

  
  # code of application
  log = open('tornado.' + str(port) + '.log', 'a+')
  ctx = daemon.DaemonContext(stdout=log, stderr=log,  working_directory='.')
  ctx.open()
  loop.IOLoop.instance().start()

Приложение отказывается работать. В логах демона Bad file descriptor:
Traceback (most recent call last):
File “manage.py”, line 10, in <module>
execute_from_command_line(sys.argv)
File “/var/www/inozemcev/data/www/lastargument.ru/la/lib/python3.2/site-packages/django/core/management/__init__.py”, line 385, in execute_from_command_line
utility.execute()
File “/var/www/inozemcev/data/www/lastargument.ru/la/lib/python3.2/site-packages/django/core/management/__init__.py”, line 377, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File “/var/www/inozemcev/data/www/lastargument.ru/la/lib/python3.2/site-packages/django/core/management/base.py”, line 288, in run_from_argv
self.execute(*args, **options.__dict__)
File “/var/www/inozemcev/data/www/lastargument.ru/la/lib/python3.2/site-packages/django/core/management/base.py”, line 338, in execute
output = self.handle(*args, **options)
File “/var/www/inozemcev/data/www/lastargument.ru/last_argument/game/management/commands/starttornadoapp.py”, line 78, in handle
loop.IOLoop.instance().start()
File “/var/www/inozemcev/data/www/lastargument.ru/la/lib/python3.2/site-packages/tornado/ioloop.py”, line 858, in start
event_pairs = self._impl.poll(poll_timeout)
IOError: Bad file descriptor
Traceback (most recent call last):
File “/usr/lib/python3.2/logging/__init__.py”, line 943, in emit
self.flush()
File “/usr/lib/python3.2/logging/__init__.py”, line 923, in flush
self.stream.flush()
IOError: Bad file descriptor
Logged from file starttornadoapp.py, line 75
DEBUG Tornado Launcher. IOLoop.instance start
Traceback (most recent call last):
File “manage.py”, line 10, in <module>
execute_from_command_line(sys.argv)
File “/var/www/inozemcev/data/www/lastargument.ru/la/lib/python3.2/site-packages/django/core/management/__init__.py”, line 385, in execute_from_command_line
utility.execute()
File “/var/www/inozemcev/data/www/lastargument.ru/la/lib/python3.2/site-packages/django/core/management/__init__.py”, line 377, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File “/var/www/inozemcev/data/www/lastargument.ru/la/lib/python3.2/site-packages/django/core/management/base.py”, line 288, in run_from_argv
self.execute(*args, **options.__dict__)
File “/var/www/inozemcev/data/www/lastargument.ru/la/lib/python3.2/site-packages/django/core/management/base.py”, line 338, in execute
output = self.handle(*args, **options)
File “/var/www/inozemcev/data/www/lastargument.ru/last_argument/game/management/commands/starttornadoapp.py”, line 77, in handle
loop.IOLoop.instance().start()
File “/var/www/inozemcev/data/www/lastargument.ru/la/lib/python3.2/site-packages/tornado/ioloop.py”, line 858, in start
event_pairs = self._impl.poll(poll_timeout)
IOError: Bad file descriptor

Офлайн

#2 Ноя. 22, 2015 00:08:40

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Демонизировать торнадо процесс

Запускай через supervisord и не парься.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version