누군가 Bash에서 동기 작업과 비동기 작업의 예를 제공할 수 있습니까?

누군가 Bash에서 동기 작업과 비동기 작업의 예를 제공할 수 있습니까?

Bash 4.4 변경 로그에 따르면:

https://lists.gnu.org/archive/html/info-gnu/2016-09/msg00008.html

bash-4.3과 bash-4.4 사이에는 호환되지 않는 변경 사항이 있습니다. Bash는 이제 모든 작업이 아닌 비동기 작업의 종료 상태만 유지합니다. 이는 이전에 완료된 동기화 명령의 상태를 검색하기 위해 "대기"를 사용할 수 없음을 의미합니다.

https://fossies.org/diffs/bash/4.3.46_vs_4.4/CHANGES-diff.html

Bash는 많은 하위 프로세스를 생성하고 가져오는 스크립트 중에 테이블이 너무 커지는 것을 방지하기 위해 상태를 기억하는 배경 pid 테이블에만 비동기 명령을 추가합니다. 즉, "대기"는 더 이상 동기화 작업에 작동하지 않지만 이러한 경우 종료 상태를 가져오는 데 $?를 사용할 수 있습니다.

저는 이미 4.3과 4.4 사이의 다른 주요 변경 사항에서 막혔지만 이 특정 변경 사항을 테스트하기 위해 샘플을 작성하는 방법을 모르겠습니다.

Bash에서 동기 작업과 비동기 작업의 차이점은 무엇입니까? 쿼리 대기 중인 pid 테이블은 어디에 저장되나요?

답변1

예:

4.3

bash-4.3$ (echo "$BASHPID"; exit 123)
5358
bash-4.3$ wait 5358; echo "$?"
123

4.4

bash-4.4$ (echo "$BASHPID"; exit 123)
12171
bash-4.4$ wait 12171
bash: wait: pid 12171 is not a child of this shell

wait더 이상 포그라운드에서 (동기적으로) 실행 중인 서브셸의 종료 상태를 가져오는 데 를 사용할 수 없습니다 .전망대화형 셸에 대한 작업을 참조하지만 비대화형 셸에서 실행되는 명령에도 동일하게 적용됩니다.

나중에 다음을 통해 포그라운드로 가져오는 백그라운드 작업에도 작동합니다 fg.

bash-4.4$ (sleep 10; exit 123) &
[1] 12857
bash-4.4$ fg
( sleep 10; exit 123 )
bash-4.4$ wait 12857
bash: wait: pid 12857 is not a child of this shell

with bash-4.3와 before는 bash모든 과거 배경 및 전경 명령의 종료 상태를 기억합니다. 일반적으로 스크립트의 pid나 다음 사항을 모르기 때문에 전경 명령에는 유용하지 않습니다.

cmd1 &
...
cmd2
wait "$!"

cmd1PID가 재사용되었을 가능성이 높습니다 cmd2. 이 경우 종료 상태가 대신 wait "$!"표시됩니다 . 비동기 명령의 pid만 기록하면 명령에 대한 잘못된 종료 상태가 발생할 위험이 약간 줄어듭니다(@Christopher가 언급한 성능 문제 외에도).cmd2cmd1wait

관련 정보