如何在队列中和后台运行异步命令?

时间:2019-06-18 07:00:14

标签: linux bash macos shell terminal

我想分别使用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服务器在后台运行,并且只有在redis服务器完全启动时,我才要运行mongod服务。等等。

在脚本末尾,我想在终端上看到我的工作区已启动

现在发生的是将它们全部运行在一起,我可以在redis的终端中看到mixin日志,然后在mongo的终端中看到,然后在npm等中看到一些。

我该如何实现?

1 个答案:

答案 0 :(得分:2)

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

#!/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