如何在两个相互依存的upstart或/etc/init.d服务之间放置更大的延迟?

我的PostgreSQL服务必须在OpenVPN之后启动,当我检查rc.X目录时,它们被列为S16openvpn和S19postgresql,因此它们的顺序是正确的。

但是,通过VPN连接到数据库失败,日志始终表明PostgreSQL在启动时无法绑定。 我的猜测是OpenVPN服务需要一些时间才能启动,并且在加载OpenVPNnetworking之前启动PostgreSQL

有没有办法让PostgreSQL在放弃之前尝试重新加载并尝试绑定到OpenVPNnetworking?

在我看来,你正试图将postgres绑定到与隧道相关的IP上。 如果是这样, ip_nonlocal_bind是解决您的问题。 通过设置ip_nonlocal_bind,可以绑定到任何IP,甚至是一个不与计算机关联的IP,当你想绑定到一个你还没有的IP时,这正是你想要的 – 例如当使用虚拟IP在浮动和被动节点。

假设这只是ipv4;

 echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind 

或者把它放到/etc/sysctl.conf

 net.ipv4.ip_nonlocal_bind 

这是我在这种情况下使用了很多时间的解决方法:编辑postresql rc.d启动脚本,并使用sleep bash命令添加延迟。 我知道这不是很干净,也许任何人有更好的解决scheme。

废弃2个独立的启动脚本,只要创build一个以正确的顺序调用它们的程序,就可以使用任何你喜欢的逻辑