exec가 스크립트를 계속 실행하는 것을 방지하는 방법은 무엇입니까?

exec가 스크립트를 계속 실행하는 것을 방지하는 방법은 무엇입니까?

나는 exec이것을 다음과 같이 사용합니다 :

#!/bin/bash
exec > >(tee /tmp/mylog.log) 2>&1
bash -c 'sleep 12312' &

명령의 출력을 로그 파일에 저장하고 장기 실행 스크립트를 시작하여 출력에 대해 아무 작업도 수행하지 않고 완전히 분리하려고 합니다.

그러나 exec를 사용하여 출력을 파일로 리디렉션하는 스크립트를 실행하면 장기 실행 스크립트로 계속 실행된다는 것을 알았습니다. 예를 들어 위 스크립트를 파일에 저장하고 /tmp/start.sh실행하면 여전히 실행 중이 ps aux라는 메시지가 표시됩니다 !/bin/bash /tmp/start.sh

그러나 exec 줄을 제거하면 예상대로 작동합니다.

그렇다면 exec stdout 리디렉션을 "분리"하고 스크립트가 끝나자마자 스크립트가 종료되도록 하려면 어떻게 해야 할까요?

답변1

지속적으로 실행되는 bash 프로세스는 tee원래 스크립트가 아닌 상위 프로세스입니다. 프로세스 ID를 표시하는 추적을 추가하면 이를 확인할 수 있습니다.

#!/bin/bash
echo original=$$
exec > >(echo substitution=$BASHPID; tee /tmp/mylog.log) 2>&1
bash -c 'echo sleeper=$$; sleep 12312' &

이로 인해 추가 bash 프로세스가 나타납니다 sleep. 이러한 bash 프로세스를 제거하려면 exec다음을 사용하십시오.

#!/bin/bash
echo original=$$
exec > >(echo substitution=$BASHPID; exec tee /tmp/mylog.log) 2>&1
bash -c 'echo sleeper=$$; exec sleep 12312' &

나는 bash 4.3에서 이 답변을 테스트했습니다. bash의 향후 버전은 ksh와 같은 tail call보다 더 똑똑해질 수 있습니다.

관련 정보