【问题标题】:How to run a second command which depend on the finish of the first command when the first command will suspend当第一个命令将挂起时,如何运行取决于第一个命令的完成的第二个命令
【发布时间】: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

标签: bash shell process jobs


【解决方案1】:

有点宽泛,但我想它明白了重点

A&
while [ some_test_fails ]; do
    sleep some_time
done
B

【讨论】:

    【解决方案2】:

    我会用

    A ; B
    

    但是 B 需要询问 A 是否已完全启动。如果是,则继续执行 B。如果不是,请稍等片刻,然后再次询问。这个问题的一个糟糕的解决方案可能是某个文件的存在。

    我不会使用anubhava的解决方案,因为如果睡眠时间太短,可能会导致不稳定。

    【讨论】:

      【解决方案3】:
      I thought of using:
      
      A & B
      

      做比,然后在进程 B 上放置一个循环来检查 A 是否被挂起。

      How to see if a process is suspended in unix

      如果 A 被挂起,则 B “Main”开始。

      【讨论】:

        猜你喜欢
        • 2018-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        • 2015-07-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多