【问题标题】:How to run async commands in queue AND in background?如何在队列和后台运行异步命令?
【发布时间】:2019-10-31 18:15:22
【问题描述】:

我想分别使用 MacOS 和 LinuxOS 创建一个 Shell 脚本 (.sh)。这就是我所做的:

#!/bin/bash

redis-server &
mongod &
cd ~/some/path && npm start &
cd ~/some/path && ./ngrok http 3000 -region=eu &

echo "My Workspace has been started"

我希望 redis-server 在后台运行,并且只有在 redis-server 完全启动时,我才希望运行 mongod 服务。等等等等。

在脚本结束时,我想在终端上看到 My Workspace 已启动

现在发生的情况是它一起运行所有这些,我可以在 redis 的终端中看到 mixin 日志,然后是 mongo,然后是来自 npm 等的一些日志。

我怎样才能做到这一点?

【问题讨论】:

    标签: linux bash macos shell terminal


    【解决方案1】:

    您应该等待我假设的上一个命令成功执行。可以这样实现:

    #!/bin/bash
    
    redis-server && \
        mongod &&\
        cd ~/some/path && npm start &&\
        cd ~/some/path && ./ngrok http 3000 -region=eu &&\    
        echo "My Workspace has been started"
    

    这样每个命令都依赖于前一个命令的执行。但是,如果其中任何一个没有设置为在执行后退出(这很可能因为前两个是服务),它将永远不会正确完成。

    所以要解决这个问题,您可以为正在运行的服务创建一些检查,例如:

    #!/bin/bash
    
    redis-server &
    sleep $SOMEMINUTES &&\
    ps WHATEVEROPTIONSYOUPREFER | grep redis && \
    mongod &
    

    你在这里看到了模式。或者你可以依靠redis

    #!/bin/bash
    
    redis-server &
    sleep $SOMEREASONABLETIME && redis-cli ping && \
    mongod &
    cd ~/some/path && npm start &
    cd ~/some/path && ./ngrok http 3000 -region=eu &
    
    echo "My Workspace has been started"
    

    对于mongodb,据我所知,您可能不得不依靠psnetcat 来检查状态。 Here You can find some examples.

    【讨论】:

    • 有趣的事实:&& 后面的 \ 是不需要的。您可以只使用 && + 结束命令,而不使用 \ 。 &&||| 等之后的换行符和注释行被忽略。
    • 您可以使用untilpgrep redis 代替sleepps。这样它就会一直寻找直到它开始。像这样:until pgrep redis; do sleep 1; done
    • 谢谢@KamilCuk 我才知道!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多