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
2条答案
按热度按时间vh0rcniy1#
inetd服务与独立服务器的运行方式不同。inetd服务读取stdin并写入stdout,让inetd处理TCP/IP的细节,而不是跟踪自己的套接字。如果你想让一个服务器在inetd下运行,它也必须这样做。
下面的程序在我的机器上的xinetd下运行得很好:
注意,我一点也不担心套接字xinetd会安排一些事情,以便服务可以读取标准输入并写入标准输出。在大多数情况下,您只需编写应用程序,就像在控制台上运行它一样。套接字详细信息在服务的配置文件中指定。(注意,您可能能够使用stdin/stdout来获取/设置有关套接字的详细信息,这可能是实际的套接字--我不确定--但您真的应该把这些东西留给inetd。)
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的一个很好的例子是:
编辑您的
/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
看起来像这样: