xinetd держит процесс открытым, когда клиент отключается
Я задавал этот вопрос более или менее ранее на 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, и ее довольно просто исправить?
2 ответа
Заставьте серверный процесс завершиться, когда он обнаружит отключение.
Added
Когда ОС сервера обнаруживает, что соединение TCP было закрыто, выполняет чтение и запись с stdout
/ stderr
потерпит неудачу с:
IOError: [Errno 104] Connection reset by peer
Поэтому убедитесь, что ваш код не игнорирует исключения, когда они возникают.
Однако этот (и любой другой метод) будет работать только тогда, когда сервер узнает об отключении. Чистые перезагрузки обычно закрывают все TCP-соединения, но "отключение" не дает.
Вы пытались установить wait = yes
?
Согласно документации, это
wait — Defines whether the service is single-threaded (yes) or multi-threaded (no).