我有一个程序,在正常激活下会监听某个端口。
我不希望程序连续运行。
是否有一种“快速而肮脏”的方法将应用程序包装在 shell 脚本或类似的脚本中,以监视适当的端口并按需启动服务?
最简单的方法可能会导致连接失败,因为包装器必须释放端口,然后启动应用程序。如果客户端只是在短时间内再次连接,那么一切都可以正常工作。
但如果这一切对客户完全透明,那就更好了。
答案1
作为理查德已经提到过,您要找的东西已经存在很长时间了。它被称为内网。
inetd 有多种实现。有些很简单,只做套接字激活的事情(它们通常只是inetd
一些包含其他基本网络工具的更大软件包的程序,例如GNU inetutils或者忙碌盒或已移植到 Linux 的 BSD 工具),有些提供更多功能(西内特很受欢迎,线网将自己描述为“可怕的过度功能”),并且 inetd 中有一个实现系统(systemd 没有实现什么?)。
几乎每个 UNIX 系统都带有 inetd 实现。传统上,“小”服务(例如 echo、finger、ftp 等)使用 inetd,而“大”服务(例如 httpd 和 NFS 以及帮助程序以及 ssh)则没有使用。使用您的发行版的默认 inetd 实现,除非您需要的不仅仅是基本服务。
答案2
也可以要求 systemd 打开一个套接字(无论是 TCP、UDP 还是 unix AF),然后在收到连接时启动服务。由于并非所有服务都乐意通过现有套接字并更愿意创建自己的套接字,因此 systemd 还包含一个名为 systemd-socket-proxyd 的帮助程序,它会缓冲 systemd 打开的套接字上的内容,直到所请求的服务在线购买正确的侦听套接字。