저는 bash 스크립팅을 처음 접했고 다음을 달성하는 가장 좋고 쉬운 방법이 무엇인지 묻고 싶습니다.
- 명령을 병렬로 실행합니다(예: Nodejs 웹 애플리케이션 실행). 명령의 출력은 평소와 같이 콘솔에 기록되어야 합니다.
- 출력에 특정 문자열이 나타날 때까지 기다립니다(예: "DB가 초기화되었습니다.")
- 그런 다음 다른 명령(예: 일부 데이터베이스 데이터를 생성하는 명령)을 실행합니다.
- 그런 다음 1.의 명령이 끝날 때까지 기다립니다.
다음은 wait 에 대한 현재 스크립트이지만 sleep
물론 이는 해결 방법일 뿐입니다.
# parallel command
npm run start &
# wait for specific output
sleep 15s
# do something
node_modules/.bin/knex seed:run
# wait for parallel command to exit
wait
내가 하나 찾았어유제하지만 병렬로 실행된 명령의 출력이 콘솔에 인쇄되지 않는 것 같습니다.
배경: 이 스크립트는 nodejs 이미지의 alpine 변형을 기반으로 하는 docker 이미지의 진입점입니다.
답변1
이를 달성할 수 있는 방법 중 하나는 다음과 같습니다.
npm run start |
tee /dev/tty | {
grep -q "DB initialized" && node_modules/.bin/knex seed:run
cat >/dev/null
}
tee /dev/tty
출력을 복사하여 npm
터미널로 보내고 후속 명령으로 파이프합니다.
grep -q
상태와 일치하는 첫 번째 항목에서 자동으로 종료됩니다 0
. 그러면 "AND" 목록( node_modules/.bin/knex seed:run
)의 다음 명령이 트리거됩니다.
cat /dev/null
파이프를 계속 열어 두는 것입니까? 종료하면 파이프에 더 많은 데이터를 쓰려고 시도하고 차례로 종료하는 동안 SIGPIPE 신호가 수신됩니다 grep -q
. tee
이렇게 하면 종료할 cat
때까지 파이프에서 읽는 것이 방지됩니다 .npm
tee
비동기식으로 실행할 필요가 없습니다 npm
. 파이프라인의 모든 구성 요소가 동시에 실행됩니다. 유일하게 확인해야 할 점은 느린 구성 요소가 완료되기 전에 해당 구성 요소가 종료되지 않는다는 것입니다.
이 코드 조각 은 /dev/tty
제어 터미널 없이 프로세스 컨텍스트에서 실행되는 경우 작동하지 않을 수 있습니다. /dev/fd/n
시스템의 양식에서도 표준 스트림에 액세스할 수 있다고 가정하면 또 다른 옵션은 다음과 같습니다.
npm run start | {
tee /dev/fd/9 | {
grep -q "DB initialized" && node_modules/.bin/knex seed:run
cat >/dev/null
}
} 9>&1
9
선택한 파일 설명자는 전체 파이프의 표준 출력이 연결된 파일의 복사본으로 생성되어 /dev/fd/9
외부 목록 { ... }
의 모든 명령 에서 사용할 수 있습니다.