【发布时间】:2017-08-22 14:31:31
【问题描述】:
我有一个情况,图像我有一个要运行的第一个命令,它启动一个数据库服务器,在这个命令结束时,它会挂起并监听某个端口。我还有第二个命令,即启动一些 Web 服务器以从第一个命令连接到数据库。
现在不知道怎么写这个简单的命令,试过了:
A ; B
这不起作用,因为当 A 进入挂起状态时,b 不执行,如果我键入 ctrl+c,则 B 启动,但它不再有意义,因为 A 已经终止,所以有没有数据库进程。
我试过了:
A && B
也不行,B不执行,因为A没有成功退出。
我想过使用:
A & B
这有时不起作用,因为当A进入后台时,B立即启动,所以有时,B在A还没有完成的情况下尝试连接到数据库端口,所以还没有数据库进程。
如何实现B只在A成功启动数据库时才启动?
【问题讨论】:
-
放一些合理的延迟,例如
A & sleep 20; B -
@anubhava,这是唯一的解决方案吗?延迟不能准确,有时还是会失败。
-
一个可靠的解决方案是在后台运行脚本
A。使用脚本继续轮询您的 数据库 状态,并且仅在数据库服务器运行时,触发脚本B -
@AaronShen 您可以尝试计算平均时间并超过它以使其工作或修改您运行命令 A 或 B 的方式。我的意思是,如果命令 A 没有结束,然后可能在后台启动它并休眠,直到您可以检索到 OK 状态以继续执行命令 B