次のコマンドを実行する前に、特定の応答を待ちます。

次のコマンドを実行する前に、特定の応答を待ちます。

次の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コマンドが実行されないことが保証されます。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が返されます。

関連情報