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

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

service myservice
{
    instances = 1
    port = 887
    socket_type = stream
    type = UNLISTED
    wait = no
    user = nobody
    server = /usr/local/bin/myscript.py
    only_from = 127.0.0.1 192.168.1.2
    disable = no
    max_load = 5.0
    nice = 5
    per_source = 1
}

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

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

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

2 ответа2

1

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


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

IOError: [Errno 104] Connection reset by peer

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


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

-1

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

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

wait — Defines whether the service is single-threaded (yes) or multi-threaded (no).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .