Принудительное завершение дочернего процесса Telnet и принудительное закрытие соединения - PullRequest
0 голосов
/ 30 января 2019

Фон

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

Я использую telnetsrvlib из https://pypi.org/project/telnetsrvlib/, чтобы добавить функциональность в мою программу Python.

Ради того, чтобы все было в одном месте, вот отрывок из многопоточного TelnetHandler:

class TelnetHandler(TelnetHandlerBase):
    "A telnet server handler using Threading"
    def __init__(self, request, client_address, server):
    # This is the cooked input stream (list of charcodes)
    self.cookedq = []   

    # Create the locks for handing the input/output queues
    self.IQUEUELOCK = threading.Lock()
    self.OQUEUELOCK = threading.Lock()

    # Call the base class init method
    TelnetHandlerBase.__init__(self, request, client_address, server)

def setup(self):
    #Omitted here

def finish(self):
    '''Called as the session is ending'''
    TelnetHandlerBase.finish(self)
    # Might want to ensure the thread_ic is dead

Краткий пример

class MyTelnetHandler(TelnetHandler):

    @command(['echo', 'copy', 'repeat'])
    def command_echo(self, params):
        '''<text to echo>
        Echo text back to the console.

        '''
        self.writeresponse( ' '.join(params) )

class TelnetServer(SocketServer.TCPServer):
    allow_reuse_address = True

server = TelnetServer(("0.0.0.0", 8023), MyTelnetHandler)
telnetThread = threading.Thread(target=server.serve_forever, args=(1,))
telnetThread.daemon = True
telnetThread.start() 

Сервер запускается, работаети развлекает соединения соответственно.Когда я нажимаю Ctrl-C, основной процесс завершается, как и telnetThread , если только не происходит активный сеанс Telnet.

Присоединяя gdb, я вижу, что новый поток создается при запуске сеанса Telnet.Если я вручную уничтожу поток сеанса, завершение продолжится, как и должно быть.

(gdb) информационных потоков

10 Thread 0x7fffe57fb700 (LWP 3202)  0x00007ffff7827c2c in __libc_recv (
  fd=<value optimized out>, buf=<value optimized out>, n=<value optimized out>, 
  flags=<value optimized out>) at ../sysdeps/unix/sysv/linux/x86_64/recv.c:34
9 Thread 0x7fffe61fc700 (LWP 3200)  0x00007ffff7827ca3 in recvfrom ()
  at ../sysdeps/unix/syscall-template.S:82
3 Thread 0x7fffed2b1700 (LWP 3194)  0x00007ffff6edb6a3 in select ()
  at ../sysdeps/unix/syscall-template.S:82
* 1 Thread 0x7ffff7fe5700 (LWP 3190)  sem_wait ()
  at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86

Самый новый поток, # 10, этоСеанс Telnet.

Вопрос

Как заставить сервер закрыть любые активные сеансы?

...