2012-03-14 2 views
0

Я пытаюсь запустить простой сервер при запуске. OS, которую я использую, - Debian 6.0. Я добавил строку в моем .profile для запуска скрипта python: python /root/desktopnavserver2.py Компьютер загружается и регистрируется, однако я получаю сообщение об ошибке ниже. Скрипт отлично работает, когда у меня нет строки добавления в debian .profile, и я просто запускаю скрипт сам в консоли. Любая помощь?Запуск простого TCP-сервера Python при входе в систему Debian

Трассировка Ошибка:

Traceback (most recent call last): 
    File "/root/Desktop/navserver2.py", line 39, in <module> 
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) 
    File "/usr/lib/python2.6/SocketServer.py", line 402, in __init__ 
    self.server_bind() 
    File "/usr/lib/python2.6/SocketServer.py", line 413, in server_bind 
    self.socket.bind(self.server_address) 
    File "<string>", line 1, in bind 
error: [Errno 98] Address already in use 

Источник:

#!/usr/bin/python 

import SocketServer 
import serial 
com2 = serial.Serial(
    port = 1, 
    parity = serial.PARITY_NONE, 
    bytesize = serial.EIGHTBITS, 
    stopbits = serial.STOPBITS_ONE, 
    timeout=3, 
    xonxoff = 0, 
    rtscts = 0, 
    baudrate = 9600 
) 

class MyTCPHandler(SocketServer.BaseRequestHandler): 
    """ 
    The RequestHandler class for our server. 

    It is instantiated once per connection to the server, and must 
    override the handle() method to implement communication to the 
    client. 
    """ 


    def handle(self): 
     # self.request is the TCP socket connected to the client 
     self.data = self.request.recv(1024).strip() 
     #print "%s wrote:"%self.client_address[0] 
     #print self.data 
     # just send back the same data, but upper-cased 
     self.request.sendall(self.data.upper()) 
     com2.write(self.data) 

if __name__ == "__main__": 
    HOST, PORT = "192.168.0.200", 14052 #change to 192.168.0.200 

    # Create the server, binding to localhost on port 9999 
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) 

    # Activate the server; this will keep running until you 
    # interrupt the program with Ctrl-C 
    server.serve_forever() 

ответ

1

Я считаю, что .profile выполняется каждым экземпляром оболочки, которая идентифицирует себя как оболочку входа. Вероятно, у вас есть более одной такой оболочки.

Вложение сценария с одним экземпляром в ваш .profile - это плохая идея - это означает, что вы можете иметь только один сеанс входа в систему, следующие сеансы вызовут эту ошибку.

3

Линия error: [Errno 98] Address already in use объясняет это - выяснить, что работает на этом порту при входе в программу (подсказка: это .py вызывается дважды?)

+0

hmms Иногда сценарий работает нормально, а другие - нет. Похоже, сценарий на самом деле работает дважды, как вы предложили, но я не знаю, почему. Когда я получаю эту ошибку, и я набираю lsof -i, я вижу, что есть скрипт python с использованием того же порта. Проблема в том, что если я удаляю строку из .profile, которая запускает скрипт, экземпляров сценария нет. – Richard

+0

Вы используете несколько терминалов/окон? Если это так, вам нужно будет проверить, что сценарий еще не запущен, когда вы запускаете его через строку 'ps -ef' в вашем .profile – KevinDTimm

Смежные вопросы