我有几个服务器和其它后台程序,我需要以正确的顺序启动。

我从骨架脚本创建的init.d脚本,并可以将它们安装使用编号命名系统以正确的顺序启动,但一些问题依然存在:

一台服务器(“serverA的”)需要初始化数据库连接,然后一个插座上听。 另一台服务器(“serverB上”),则需要连接到插座上,如果前进程尚未监听的连接将失败。有没有一种方法,以防止为serverA上的init.d脚本终止,直到serverA的已经开始在听吗?该初始化serverB上不会启动,直到serverA的初始化已终止。

目前,安装工作由具有serverB上只重试连接,直到成功为止,但做法似乎弱不禁风。我想的如何强制测序更确定性的理解。

有帮助吗?

解决方案

是的,这是我的问题,我回答,但我发现这种技术是有用的,和我分享给其他人用类似的问题所困扰。

我发现socat是在等待一个插座或端口非常有用的。一个的init.d脚本等:

case “$1″ in
  start)
  echo '--benign phrase' | socat - UNIX-CONNECT:/path/to/socket,retry=10,intervall=1
;;

将等待,直到插座变得可写,然后返回。没有参与系统守护进程,所以较高编号的init.d脚本的它阻止执行,直到其完成。

这样的服务员脚本的使用将减缓启动顺序,并因此非最佳,但距离洒“睡眠否”脚本语句非常脆弱的方法有了很大的改进。

其他提示

我不认为这是脆弱的 - 至少我能想到的方案的的,它不会是脆弱的。有5秒和它的不差重试时间。它是一个KISS的方法,而且没有任何一个角落的情况下,你不明白。

获取同步的分布式环境不适合心脏微弱,及其在你的榜样矫枉过正。

要给你一些信心,你的方法,我可以告诉你,我有几十个分布在网络农场手写复杂的服务器进程的,他们从来没有给我甚至任何的悲伤,当数据库服务器已经消失,或者当网络树干已经等了下来,他们只是继续在降级模式运行,直至数据库回来。

如果服务器监听域套接字,你可以建立一个循环,对于插座投票。有可能是在bash做到这一点更简单的方法,但它可能看起来像:

for i in 1 2 3 4 5; do
  if [ -e '/var/run/myserver.sock' ]; then
    break
  fi
done

另一个解决方案是在您的服务器不守护进程,直到它已经打开监听套接字。这样一来,初始化脚本将暂停,直到过程daemonizes,这保证了插座可用。

当然,这取决于你的应用做了系统守护进程本身,而不是通过一些其他手段。 ( “/ USR /斌/ MYSERVER&” 等。)

更新:

另外要注意的是,你现在正在做的是所有System-V风格的初始化。 Ubuntu的实际使用暴发户,这是一个基于事件的系统,而不是脚本的序列。你可以选择使用暴发户的工作,而不是系统-V init脚本,并发射从您的服务器定制新贵事件,这将触发启动你的第二个服务器。

href="http://upstart.ubuntu.com/getting-started.html" rel="nofollow noreferrer" title="Getting发起者-upstart">入门指南具有一个例子的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top