等待具体响应,然后执行下一条命令

等待具体响应,然后执行下一条命令

我有以下 bash 脚本:

#!/bin/bash
set -m
./cloud_sql_proxy -instances=[project-id]:[region]:[instance-id]=tcp:5432 -credential_file=serviceaccount.json &
sleep 5
node app.js

首先,我想要cloud_sql_proxy运行该命令。 5 秒后,我还想node运行该命令。第一个命令 ( cloud_sql_proxy) 是一个持续运行的命令,因此 await在这里不起作用(它一直等待)。

cloud_sql_proxy命令“准备就绪”时,它会输出“准备好新连接”。无论如何,我是否可以“捕获”此输出,检查它是否“准备好新连接”,如果是,则执行第二个命令(node)?这样,我不再需要该命令,并且如果该命令有问题,sleep 5我确信该命令不会运行。nodecloud_sql_proxy

答案1

由于您的代理进程在后台运行,因此捕获输出的正常方法不起作用(例如var=$(echo "test command"):)

捕获所需输出的最简单方法是将所有输出重定向到一个文件,然后检查该文件中是否有您需要的字符串。

这是一个例子:

#!/bin/bash

set -m

# Added output redirection for stdout and stderr
./cloud_sql_proxy --add_your_options_here >filename 2>&1 &

# Wait for up to 5 seconds for the service to be ready.
for attempt in $(seq 1 5); do
    sleep 1
    if grep -q "Ready for new connections" filename; then
        break
    fi
    if [[ attempt -eq 5 ]]; then
        echo "Error launching sql proxy - see 'filename' for command output."
        exit
    fi
done

node app.js

要查看输出,cat filename.

只要每次运行脚本时文件都被截断,此解决方案就应该有效。如果不是,grep由于文件中的文本“过时”,将返回 true。

相关内容