tee를 사용하고 기다릴 때 스크립트가 중단됩니다. 이유는 무엇입니까?

tee를 사용하고 기다릴 때 스크립트가 중단됩니다. 이유는 무엇입니까?

내 NAS 서버에 대한 snapraid를 자동화하는 스크립트를 실행하고 있습니다. 다음은 온라인에서 찾은 스크립트이며 데비안 9에서 문제 없이 실행됩니다. 지난주에 Debian 10으로 업데이트했는데 이제 Debian 9에서는 작동하지 않는 위치에서 스크립트가 중단됩니다. 문제로 좁혀서 명령을 기다리고 있는 것 같습니다.

테스트를 위해 스크립트를 다음 스니펫으로 단축했는데 문제가 발생하고 있으므로 기다려야 한다고 생각합니다.

#!/bin/bash

# location of the snapraid binary
SNAPRAID_BIN="/usr/local/bin/snapraid"

# redirect all output to screen and file
> $TMP_OUTPUT
exec 3>&1 4>&2
# NOTE: Not preferred format but valid: exec &> >(tee -ia "${TMP_OUTPUT}" )
exec > >(tee -a "${TMP_OUTPUT}") 2>&1

# run the snapraid DIFF command
echo "###SnapRAID DIFF [`date`]"
$SNAPRAID_BIN diff
# wait for the above cmd to finish
wait
echo
echo "DIFF finished [`date`]"

또한 무슨 일이 일어나고 있는지 확인하기 위해 htop을 실행했는데 snapraid 명령으로 생성된 프로세스가 종료되지 않았습니다.

wait는 해야 할 일을 하고 있습니다. 그런데 이 방법이 이전에는 작동했지만 지금은 작동하지 않는 이유는 무엇입니까?

전체 스크립트는 여기에 있습니다:https://pastebin.com/gJqnz875

답변1

프로세스 내의 교체는 tee표준 입력에서 eof를 수신하거나 일부 오류가 발생할 때까지 종료되지 않습니다.

EOF그리고 표준 입력은 파이프이므로 쓰기 측의 모든 핸들이 닫힐 때 표준 입력에서 하나만 얻습니다.

따라서 원본 stdout 및 stderr을 저장한 다음 fd를 닫아 복사하기 wait전에 원본 파일로 리디렉션해야 합니다 .new>&oldold

exec {out}>&1 {err}>&2
exec > >(tee -a output) 2>&1
...
exec >&$out 2>&$err
wait $(pgrep -P "$$")

또한 최신 버전의 bash에서만 프로세스 교체에서 실행 중인 프로세스를 wait기다리고 있기 > >(...)때문에 단순히 부모 프로세스를 찾는 wait $(pgrep -P "$$")대신 사용합니다. 또한보십시오waitpgrep -P여기이것과 다른 관련 함정에 대해 > >(...).

관련 정보