Найти - Пользователи
Полная версия: Демонизировать торнадо процесс
Начало » Python для новичков » Демонизировать торнадо процесс
1
inozemcev
Есть торнадо приложение которое обслуживает игру:

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
Budulianin
Запускай через supervisord и не парься.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB