Linux: Как сделать демон / сервис пригодным для использования с xinetd? - PullRequest
5 голосов
/ 18 августа 2010

Кто-нибудь знает, какие изменения необходимы для работы сервера с xinetd?

. Сервером является почтовый сервер .NET, работающий в Linux. Сообщение на форуме Lumisoft Mailserver

Примечание: xinetd, а не моно-сервис.[x] inetd - это интернет-сервер. Суперсервер запускает серверную службу по требованию.
(в отличие от непрерывно работающей службы сервера, что делает моно-служба)

Ответы [ 2 ]

7 голосов
/ 18 августа 2010

Служба inetd работает не так, как автономный сервер. Сервисы inetd читают stdin и пишут в stdout, позволяя inetd обрабатывать мрачные детали TCP / IP, а не отслеживать свои собственные сокеты. Если вы хотите, чтобы сервер работал под inetd, он должен сделать то же самое.

Следующая программа прекрасно работает под xinetd на моей машине:

#include <iostream>
#include <string>

using namespace std;  // yeah, i'm lazy.

int main()
{
    string name;
    cout << "What's your name? " << flush;
    cin >> name;
    cout << "Hi, " << name << "!" << endl;
}

Заметьте, я не беспокоюсь о сокетах - xinetd упорядочивает вещи так, что сервис может читать стандартный ввод и записывать в стандартный вывод. Вы просто пишете свое приложение так, как если бы оно работало на консоли, по большей части. Детали сокета указаны в файле конфигурации для сервиса. (Обратите внимание, что вы можете получить / установить сведения о сокете, используя stdin / stdout, который может быть реальным сокетом - я не уверен - но вам действительно следует оставить этот материал до inetd.)

1 голос
/ 07 октября 2012

Сервисы inetd действительно хороши для одноразовых приложений, которые должны принимать данные и взаимодействовать с пользователем в определенной степени. ИТ работает через tcp / udp, передавая данные через сокет (x) inetd в std {in, out, err}. Приложения inetd также хорошо работают с tcpwrappers для улучшения безопасности через файлы системной политики и ACL.

Так что да, вы бы написали свое приложение, как его консольное приложение, поскольку на самом деле это консольное приложение. Просто представьте, что inetd - это прозрачный обратный прокси-сервер от сети до входов вашего приложения.

Совет, напишите свой код для правильной обработки сигналов процесса, и если вам нужно взаимодействовать с другим процессом в системе, используйте для этого сокеты unix / fifo.

Кроме того, не пытайтесь написать приложение, которое транслирует много данных одновременно или требует большого количества соединений. Масштабируемость является проблемой, поскольку inetd становится узким местом, поэтому Apache и Sendmail отказались от поддержки inetd и вместо этого работают как моно-приложения. HTTP лучше подходит для этой роли, и сценарий fastcgi (или вставьте любимую структуру) с nginx лучше всего подходит для этого варианта использования.

Хороший пример для inetd:

lock = Mutex.new

trap :HUP  { #log the connection and cleanup }
trap :USR1 { lock.synchronize do #stuff; end }
trap :TERM { #clean up }
trap :KILL { #clean up and die with error codes }

puts "App name - version"

loop do
  ('%s> ' % Console.prompt).display
  input = gets.chomp
  command, *params = input.split /\s/
  case command
    when /\Ahelp\z/i
      puts App.help_text
    when /\Ado\z/i
      Action.perform *params
    when /\Aquit\z/i
      exit
    else
      puts 'Invalid command'
  end
end
exit

Отредактируйте /etc/services, включив в него свое приложение следующим образом: Порт myapp # / proto

и добавьте ваше приложение в /etc/inetd.conf (или xinetd.d) следующим образом: myapp stream tcp6 nowait myappuser / path / to / myapp myapp -arg_flags

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...