xinetd держит процесс открытым, когда клиент отключается

2318
Sirex

Я задавал этот вопрос более или менее ранее на stackoverflow и считал, что он решен (поэтому принял ответ), но оказывается, что он не был решен. :-(

Проще говоря, я написал скрипт на python, который просто выводит текст постоянно на стандартный вывод, вот и все, что он делает 24/7. Я связал его с этим файлом xinetd

сервис myservice { случаи = 1 порт = 887 socket_type = stream type = UNLISTED подождите = нет пользователь = никто server = /usr/local/bin/myscript.py only_from = 127.0.0.1 192.168.1.2 отключить = нет max_load = 5.0 хороший = 5 per_source = 1 } 

Это прекрасно работает, так как когда клиент подключается, он начинает извергать текст на своей консоли. Проблема в том, что когда клиент отключается, запущенный процесс остается открытым, блокируя порт. Разрешен только один клиент (instances = 1), но это может произойти, когда клиент перезагружается при подключении.

Ранее я думал, что это потому, что скрипт python игнорирует сигналы уничтожения (что было), но с этим исправлено, наблюдается то же поведение. Чтобы уточнить, сценарий python радостно наблюдает за kill -1 и т. Д.

Я предполагаю, что это проблема xinetd, и ее довольно просто исправить?

0

2 ответа на вопрос

1
grawity

Заставьте серверный процесс завершиться, когда он обнаружит отключение.


AddedКогда ОС сервера обнаружит, что TCP-соединение было закрыто, чтение и запись из stdout/ stderrзавершатся с ошибкой:

IOError: [Errno 104] Connection reset by peer 

Поэтому убедитесь, что ваш код не игнорирует исключения, когда они возникают.


Однако этот (и любой другой метод) будет работать только тогда, когда сервер узнает об отключении. Чистые перезагрузки обычно закрывают все TCP-соединения, но «отключение» не дает.

это из солидного опыта? - потому что, насколько я могу судить, нет никакого способа сделать это из сценария Python (может быть, есть)? - он просто извергает вывод постоянно, подобно команде bash "yes". Sirex 13 лет назад 0
@Sirex: `sys.stdin` привязан к сокету TCP, и если сокет закрыт,` sys.stdin.write` завершится ошибкой. То же относится и к любому языку: вы не можете писать в закрытый сокет. grawity 13 лет назад 0
Хорошо, оставлю этот вопрос открытым, так как я ухожу на 2 недели, но я проверю, когда вернусь. Я не уверен, что tcp соединение закрыто клиентом чисто, но я посмотрю. Выше, конечно, вы имеете в виду sys.stdout и sys.stdout.write? Sirex 13 лет назад 0
@Sirex: На самом деле я имел в виду как `sys.stdin`, так и` sys.stdout`. (Да, это должен был быть либо `stdin.read ()`, либо "stdout.write ()`.) grawity 13 лет назад 0
-1
Janne Pikkarainen

Вы пытались установить wait = yes?

Согласно документации, это

wait — Defines whether the service is single-threaded (yes) or multi-threaded (no). 
Первоначально не помогло, но я буду проверять дальше. Sirex 13 лет назад 0

Похожие вопросы