我有以下 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
我确信该命令不会运行。node
cloud_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。