일부 작업을 병렬로 수행하기 위해 스크립트에서 일부 작업을 시작하고 싶습니다. 활성 작업 수를 세어 작업이 완료되는 시점을 알 수 있습니다. 내가 가진 문제는 일시적으로 쓰기와 읽기를 처리하지 않고도 이러한 작업에서 값을 반환하고 싶다는 것입니다.
이 예에서는 실행 중인 작업 수를 계산할 수 있지만 값은 a
다음과 같이 업데이트되지 않습니다 456
.
function _n_jobs() {
echo $(jobs -r | wc -l | tr -d " ")
}
a=123
(
sleep 2s
a=456
) &
echo "Number of jobs: "$(_n_jobs)
while (( $(_n_jobs) > 0 )); do
sleep 0.1s
done
echo $a
나는 병렬로 실행되는 작업에서 값을 얻기 위해 서브셸의 출력을 파일 설명자에 쓸 수 있다는 것을 발견했습니다. 하지만 이 서브셸은 작업으로 등록되지 않습니다. 즉, 일련의 병렬 작업이 컴퓨팅 작업처럼 계산될 수 없기 때문에 언제 완료되었는지 알 수 없습니다.
이 예에서는 하위 쉘의 출력을 파일 설명자로 리디렉션하여 하위 쉘에서 값을 얻을 수 있지만 작업 수는 입니다 0
.
function _n_jobs() {
echo $(jobs -r | wc -l | tr -d " ")
}
a=123
exec {fd}< <(
sleep 2s
echo 456
)
echo "Number of jobs: "$(_n_jobs)
read <&${fd} a
echo $a
이런 식으로 내 직업의 가치를 반환할 수 있는 방법이 있나요?
예제에서는 숫자를 반환하지만 종료 코드를 읽는 것만으로는 충분하지 않습니다. 결과가 임의적이기를 원하므로 문자열도 반환할 수 있습니다. 이것이 바로 파일 설명자를 사용하는 이유입니다.