다음 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
명령이 실행되지 않을 것이라고 확신합니다.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가 반환됩니다.