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

ggazkfy8  于 2023-05-22  发布在  Linux
关注(0)|答案(2)|浏览(150)

有谁知道服务器要与xinetd一起工作需要做哪些更改?
服务器是在Linux上运行的.NET邮件服务器。
请参阅这篇文章的底部以供参考:Lumisoft Mailserver论坛帖子

注:xinetd,不是单服务。[x]inetd是Internet超级服务器。

超级服务器按需启动服务器服务。
(As与服务器服务连续运行相反,这正是mono-service所做的)

vh0rcniy

vh0rcniy1#

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。)

esbemjvw

esbemjvw2#

inetd服务非常适合需要接收数据并与用户进行一定程度交互的一次性应用程序。它通过tcp/udp工作,通过管道将数据从(x)inetd的套接字传输到std{in,out,err}。inetd应用程序还可以很好地与tcpwrappers配合使用,通过系统策略文件和ACL来增强安全性。
所以是的,你会把你的应用程序写得像一个控制台应用程序,因为实际上它是一个控制台应用程序。只要把inetd想象成一个从网络到应用输入的透明反向代理。
给你一个建议,写你的代码来正确处理进程信号,如果你需要与系统上的另一个进程交互,使用unix sockets/fifo。
此外,不要尝试编写一个一次性传输大量数据或需要大量连接的应用程序。可扩展性是一个问题,因为inetd成为一个瓶颈,这就是为什么Apache和Sendmail放弃了对inetd的支持,而是作为mono应用程序。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
至于xinetd,它有自己的类似于c的语法,根据发行版的不同,它可以存在于/etc/xinetd.conf/etc/xinetd.d/myapp.conf中。我建议你在manpage上读一读:https://linux.die.net/man/5/xinetd.conf
一个例子配置说in-cpio.conf看起来像这样:

service ftp 
{ 
  socket_type        = stream 
  wait               = no 
  user               = nobody
  server             = /usr/bin/cpio
  server_args        = -idv
  instances          = 1 
  nice               = 10
  only_from          = 127.0.0.1
}

相关问题