【问题标题】:Linux: How to make a daemon/service usable with xinetd?Linux:如何使用 xinetd 使守护程序/服务可用?
【发布时间】:2011-03-31 16:52:42
【问题描述】:

任何人都知道要让服务器与 xinetd 一起工作需要进行哪些更改?

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

请参阅这篇文章的底部以供参考: Lumisoft Mailserver Forum Post

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

【问题讨论】:

    标签: linux service mono daemon mail-server


    【解决方案1】:

    inetd 服务与独立服务器的运行方式不同。 inetd 服务读取标准输入并写入标准输出,让 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。)

    【讨论】:

    • 是否有任何示例,C++ 或 C 或其他?
    • 谢谢,看起来确实很简单。真的没有更多了吗?因此,如果客户端连接到任何端口,他会收到“你叫什么名字”,发送他的名字,然后返回“Hi ”。我想超时是由 xinetd 处理的。确实非常好笑。我想我必须看看 xinetd 编程,它使服务器看起来像单客户端控制台程序一样简单。
    • @Quandary:是的,就是这么简单。可能有更高级的东西你可以做,我不确定。但是您几乎可以只编写应用程序,就好像您打算在控制台上运行它一样,然后让 xinetd 处理 TCP/IP 内容。只有当您希望两个客户端能够相互交谈时,它才会变得复杂,但这与控制台应用程序也没有太大区别。我不确定超时,但是您可以在程序中使用信号来执行此操作而不会太麻烦。
    • @cHao,在你的例子中 std::cerr 去哪里了? cout 是联合的吗?
    • @0x2207:实际上,我不确定。我想它要么去到与cout 相同的地方,要么去到由inetd 设置的错误日志。
    【解决方案2】:

    inetd 服务非常适合需要接收数据并与用户进行某种程度交互的一次性应用程序。 IT 通过将数据通过套接字从 (x)inetd 传输到 std{in,out,err} 来处理 tcp/udp。 inetd 应用程序还可以与 tcpwrappers 很好地配合使用,以通过系统策略文件和 ACL 来增强安全性。

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

    忠告,编写代码以正确处理进程信号,如果需要与系统上的另一个进程交互,请使用 unix sockets/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 端口#/proto

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-16
      • 2017-05-18
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多