실행 라인에서 Bash 프로세스 교체, 일부 명령 작동이 중지됨

실행 라인에서 Bash 프로세스 교체, 일부 명령 작동이 중지됨

그래서 최근 작동을 멈춘 exec 라인에서 프로세스 대체를 사용하는 bash 명령이 있는데, 이는 다음 예제로 요약됩니다.

script.sh의 내용:

#!/bin/bash   
ls -l "$1" >/tmp/out  
echo "SUCCESS" > "$1"

이것은 작동합니다 log. "SUCCESS"를 다음 위치에 넣으세요.

rm -f log; ./script.sh >(cat >log)

또한 다음을 사용하여 작동합니다 tail.

rm -f log; ./script.sh >(tail >log)

exec작품 과 함께 사용 cat:

rm -f log; exec ./script.sh >(cat >log)

그런데... exec그리고 tail실제로아니요일하다:

rm -f log; exec ./script.sh >(tail >log)

모든 경우에 아래와 같이 /tmp/out의 내용이 양호해 보입니다.

l-wx------ 1 user user 64 Oct 14 10:55 /dev/fd/63 -> pipe:[158518]

cat작동하지만 작동하지 않는 이유는 무엇 tail입니까 head? 이것은 과거 어느 시점에서 작동했습니다. 이것은 bash 기능 변경입니까 아니면 버그 회귀입니까 ..?

bash --version: GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

답변1

따라서 교체 프로세스를 사용하면 strace커널이 tail. head간단한 해결 방법은 nohup대체 항목을 추가하는 것입니다.

rm -f 로그; exec ./script.sh >(nohup tail >log)

나는 exec가 왜 실패하는지 이해한다고 생각합니다. IIUC, >(tail >log)는 현재 프로세스의 하위 프로세스를 생성합니다 bash. 그러나 exec를 사용하면 이제 가 됩니다 script.sh. script.sh가 종료되면 커널은 이를 SIGHUP모든 하위 프로세스로 보냅니다.

이것이 왜 작동하는지 아직 확실하지 않습니다. 최신 커널 버전에서는 SIGHUP을 더 빠르고 적극적으로 보낼 수 있습니다.

관련 정보