Linux:如何使用xinetd使用守护进程/服务?

时间:2010-08-18 17:35:35

标签: linux service mono daemon mail-server

任何人都知道服务器使用xinetd需要做哪些更改?

服务器是在Linux上运行的.NET邮件服务器。

请参阅本文的底部以供参考: Lumisoft Mailserver Forum Post

注意:xinetd,而不是单一服务。 [x] inetd是一个互联网超级服务器。
超级服务器按需启动服务器服务。
(与连续运行的服务器服务相反,这是单服务所做的)

2 个答案:

答案 0 :(得分:7)

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 :(得分:1)

对于需要接收数据并与用户进行某种程度交互的应用程序,inetd服务非常适用。通过将来自(x)inetd的套接字数据管道传输到std {in,out,err},IT可以在tcp / udp上工作。 inetd应用程序也适用于tcpwrappers,以通过系统策略文件和ACL增强安全性。

所以是的,你会把你的应用程序写成一个控制台应用程序,因为实际上它是一个控制台应用程序。只需将inetd视为从网络到应用程序输入的透明反向代理。

建议,编写代码以正确处理过程信号,如果需要与系统上的其他进程进行交互,请使用unix套接字/ fifo。

此外,不要尝试编写一次性流式传输大量数据或需要大量连接的应用程序。可扩展性是一个问题,因为inetd成为一个瓶颈,这就是为什么Apache和Sendmail放弃了对inetd的支持并将其作为单声道应用程序。 HTTP更适合这个角色,使用nginx的fastcgi(或插入喜欢的框架)脚本最适合该用例。

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 port#/ proto

并将您的应用添加到/etc/inetd.conf(或xinetd.d),如下所示:     myapp stream tcp6 nowait myappuser / path / to / myapp myapp -arg_flags