그래서 최근 작동을 멈춘 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을 더 빠르고 적극적으로 보낼 수 있습니다.