2010-07-06 3 views
0

Это может быть или не быть проблемой кодирования. Это также может быть проблемой xinetd deamon, я не знаю.Управление отключением клиента python xinetd

У меня есть скрипт python, который запускается с Linux-сервера, на котором запущен xinetd. Xinetd был настроен так, чтобы разрешить только один экземпляр, поскольку я хочу, чтобы только одна машина могла подключаться к службе, что также ограничено IP.

В настоящее время, когда клиент подключается к xinetd, служба работает правильно, и скрипт начинает отправлять свой результат на клиентскую машину. Однако, когда клиент отключается (т. Е. Из-за перезагрузки), процесс все еще сохраняется на сервере, и это блокирует возможность подключения клиента после завершения его перезагрузки или так далее.

В: Как я могу обнаружить на python, что клиент отключился. Возможно, я смогу проверить, не перестает ли читать stdout от клиента (а затем выходить из сценария), или есть ли большой способ eaiser в xinetd, чтобы дочерний процесс был убит, когда клиент отключился?

(я использую Python 2.4.3 на RHEL5 Linux. - нужны решения для 2.4, но 3.1 решения было бы полезно также знать)

ответ

2

Добавить обработчик сигнала для SIGHUP. (x) inetd отправляет это при отключении сокета.

+0

Спасибо, что сработало удовольствие. При дальнейшем осмотре я фактически поймал все исключения где-то еще в коде, и поэтому sighup не передавался. – Sirex

+0

Извините, что выкалываете это, но я только что обернулся, чтобы положить это вживую. Как ни странно, это действительно не работало, как я думал. Процесс умирает при отправке сигнала один (kill -1 ), что означает, что в соответствии с этим ответом он должен умереть, когда xinetd отключен, но он доцент. Первоначальная проблема заключалась в том, что дочерний процесс python, запущенный xinetd при подключении клиента, остается в живых, даже когда клиент отключился. Эта проблема все еще существует :-( Мой процесс python просто печатает вывод на stdout (и из-за xinetd, на экран клиента) - мне нужно изменить конфигурацию xinet prehaps? – Sirex

0

Мониторинг сигналов, отправленных на ваш процесс. Возможно, ваш скрипт не отвечает на SIGHUP, отправленный xinet, контролирует сигнал и позволяет ему умереть.

0

Вы, кажется, не получаете SIGHUP, но получаете SIGPIPE, по крайней мере, до тех пор, пока вы пытаетесь подключить IO к соединению. Если приложение проводит длительные периоды времени, не выполняя никаких операций ввода-вывода, вы можете просто начать чтение потока stdin, чтобы убедиться, что вы получите SIGPIPE, как только произойдет отключение. Это было достаточно для моего приложения, но затем я не использовал никаких других труб, кроме тех, которые дал мне xinetd.

Я видел несколько мест в сети, где люди говорят о том, что SIGHUP отправляется при отключении клиента, поэтому я написал скрипт inetd python для тестирования нескольких серверов (один inetd и другой xinetd), поэтому вы можете использовать это для проверки отправленных сигналов. Он просто записывает то, что он находит в /var/log/test.log. Возможно, это будет полезно.

#!/usr/bin/python 

import os, signal, sys 

skip = ["SIGKILL", "SIG_DFL", "SIGSTOP", "SIG_IGN", "SIGCLD", "SIGCHLD"] 
name_map = {} 
identifiers = [i for i in dir(signal) if i.startswith("SIG") and not i in skip] 

for i in identifiers: 
    name_map[getattr(signal, i)] = i 

def handler(num, frame): 
    signame = name_map[num] 
    os.system("echo handled %s >> /var/log/test.log" % signame) 

if __name__ == "__main__": 
    for id, name in name_map.iteritems(): 
     signal.signal(id, handler) 

    while True: 
     print sys.stdin.readline() 
     sys.stdout.flush() 
Смежные вопросы