2016-03-21 3 views
0

я написал UdP витую сервер и запустил его с помощью следующей команды:Витая сбой сервера после того, как один день

nohup python Udpserver2.py & 

Все прошло хорошо сначала, но он принес ошибку и разбился после того, как 1 день. Информация об ошибке в nohup.out является:

Unhandled Error 
Traceback (most recent call last): 
    File "/usr/lib64/python2.7/site-packages/Twisted-15.4.0-py2.7-linux-x86_64.egg/twisted/python/log.py", line 84, in callWithContext 
    return context.call({ILogContext: newCtx}, func, *args, **kw) 
    File "/usr/lib64/python2.7/site-packages/Twisted-15.4.0-py2.7-linux-x86_64.egg/twisted/python/context.py", line 118, in callWithContext 
    return self.currentContext().callWithContext(ctx, func, *args, **kw) 
    File "/usr/lib64/python2.7/site-packages/Twisted-15.4.0-py2.7-linux-x86_64.egg/twisted/python/context.py", line 81, in callWithContext 
    return func(*args,**kw) 
    File "/usr/lib64/python2.7/site-packages/Twisted-15.4.0-py2.7-linux-x86_64.egg/twisted/internet/posixbase.py", line 597, in _doReadOrWrite 
    why = selectable.doRead() 
--- <exception caught here> --- 
    File "/usr/lib64/python2.7/site-packages/Twisted-15.4.0-py2.7-linux-x86_64.egg/twisted/internet/udp.py", line 248, in doRead 
    self.protocol.datagramReceived(data, addr) 
    File "UdpServer2.py", line 91, in datagramReceived 
    self.device_echo(data, str(host), int(port)) 
    File "UdpServer2.py", line 19, in device_echo 
    cur.execute(sql) 
    File "/usr/lib64/python2.7/site-packages/MySQLdb/cursors.py", line 174, in execute 
    self.errorhandler(self, exc, value) 
    File "/usr/lib64/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away') 

Мой питон код UdpServer2.py структурирована следующим образом:

from twisted.internet.protocol import DatagramProtocol 
from twisted.internet import reactor 
import MySQLdb as mdb 

conn = mdb.connect(host='localhost', user='root', passwd='123456', db='kj') 

class KjEcho(DatagramProtocol): 
    def device_echo(self, msg, host, port): 
     device_no = msg[1:7] 
     sql = "select did from device where device_no='%s'" % (device_no) 

     cur = conn.cursor(mdb.cursors.DictCursor) 
     cur.execute(sql)          #line 19 here 

     if 0 == cur.rowcount: 
      ... 
     else: 
      ... 
     cur.close() 

    def startProtocol(self): 
     print 'kj_udp_server starting...' 

    def datagramReceived(self, data, (host, port)): 
     print "receive msg" 
     if(18 != len(data)): 
      print 'len err' 
      return 
     if('0x86' != hex(ord(data[0]))): 
      print '0x86 err' 
      return 
     if(0 == ord(data[15])): 
      print 'from device' 
      self.device_echo(data, str(host), int(port))  #line 91 here 
     else: 
      print 'from mobile' 
      self.mobile_echo(data, str(host), int(port)) 

reactor.listenUDP(6000, KjEcho()) 
reactor.run() 

линия 91 и линия 19 причины было указано выше, как это исправить, спасибо.

Примечание: Есть много машины Каждая машина отправить сообщение на сервер каждые 20 секунд

+0

Похоже, что ваш сервер базы данных недоступен –

+0

Ошибка говорит, что ваш сервер MySQL ушел/ушел ... – Mai

ответ

0

Вы не можете передавать на подключение MySQL (или любой сокет на то пошло), остающийся в живых в течение неопределенного периода времени, особенно если нет данных, проходящих через него. Поэтому вместо того, чтобы иметь одно соединение, которое вы просто повторно используете для получения курсора, закройте соединение с курсором и откройте его снова, когда вам это нужно.

Таким образом, в сущности, вы хотите, чтобы префикс этой строки

cur = conn.cursor(mdb.cursors.DictCursor) 

С той, которая устанавливает conn, а затем добавьте следующие

cur.close() 

с одним, закрывающей conn, скорее всего conn.close().

+0

Я удивлен, что ошибка не говорит о том, что «соединение закрыто для бездействия» или похоже, если это так, но эй , MySQLdb не поддерживается, если я правильно помню. – Mai

+0

@Mai, как сообщается для mysql libs в python AFAIK, я проверил несколько из них с одинаковой ошибкой. Вы можете прочитать больше на http://dev.mysql.com/doc/refman/5.7/en/gone-away.html –

+0

Интересно ... это несколько вводит в заблуждение ... Думаю, это только я, не увидев эту ошибку , Спасибо за обмен :) – Mai

0

Спасибо большое, Май и Тимотеуш Пол

class KjEcho(DatagramProtocol): 
    def device_echo(self, msg, host, port): 
     device_no = msg[1:7] 
     sql = "select did from device where device_no='%s'" % (device_no) 

     conn = mdb.connect(host='localhost', user='root', passwd='123456', db='kj') 
     cur = conn.cursor(mdb.cursors.DictCursor) 
     cur.execute(sql) 

     if 0 == cur.rowcount: 
      ... 
     else: 
      ... 
     cur.close() 
     conn.close() 

Я думаю, что это будет хорошо, однако, для соединения, открыт и закрыт он часто, это лучше использовать пул соединений?

+0

Поскольку вы использовали мой ответ, почему вы его не приняли? –

+0

Я принял ваш ответ, спасибо за напоминание, я начинаю и не знаю, как это сделать. – liuhui