次の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
)は継続的に実行されるコマンドなので、aはwait
ここでは何の効果もありません(継続待機中です)。
cloud_sql_proxy
コマンドが「準備」されると、「新しい接続準備」が出力されます。とにかく、この出力を「キャプチャ」して「新しい接続の準備」になっていることを確認します。そうであれば、2番目のコマンド(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が返されます。