다음 명령을 실행하기 전에 특정 응답을 기다립니다.

다음 명령을 실행하기 전에 특정 응답을 기다립니다.

다음 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명령이 "준비" 되면 "새 연결 준비"가 출력됩니다.어쨌든 이 출력을 "캡처"하여 "새 연결 준비"가 되었는지 확인하고, 그렇다면 두 번째 명령( 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가 반환됩니다.

관련 정보