백그라운드 프로세스를 안전하게 종료

백그라운드 프로세스를 안전하게 종료

상위 프로세스의 파이프에 데이터를 쓰고 있습니다. 상위 프로세스는 파이프에서 데이터를 읽고 이를 화면과 로그 파일에 쓰는 백그라운드 작업을 만듭니다.
백그라운드 작업을 언제 종료해야 하는지 어떻게 알 수 있나요? wait명령은 영원히 기다립니다. "출력 끝"을 감지하기 위해 토큰을 사용하고 싶지 않습니다. 코드 예:

function log()
{
    if [ -z "$counter" ]; then
        counter=1
    else
        (( ++counter ))
    fi

    if ! [[ -z "$teepid" ]]; then
        # ***** How can I know if it's safe to kill here?
        kill $teepid
    fi
    # Display text-to-be-logged on screen
    #  & write text-to-be-logged to it's corresponding log file
    tee <"$pipe" 1>&4 "${logs_dir}/${counter}_${1// /_}" &
    teepid=$!
}

logs_dir="/path/to/log/dir"

pipe_dir=$(mktemp -d)
pipe="${pipe_dir}/cmds_output"
mkfifo "$pipe"
exec 3<>"$pipe" # link file descriptor (FD) #3 to $pipe for r/w
exec 4<&1   # save value of FD1 to FD4
exec 1>&3   # redirect all output to FD3

log # Logs the following code block
{
    # ... Many bash commands ...
}

log # Logs the following code block
{
    # ... Many bash commands ...
}

if ! [[ -z "$teepid" ]]; then
    # ***** How can I know if it's safe to kill here? Maybe it's still logging
    kill $teepid;
fi

편집하다:

나는 시도했다:

exec 3>&-
#exec 1>&- # Have tried also uncommenting this row
wait $teepid
exec 3<>"$pipe"
exec 1>&3
kill $teepid

그런데 wait 명령이 계속 멈춥니다... ps -o pid,ppid,s --pid $teepid프로세스 상태가 표시되는 것을 발견했습니다. 이걸 믿어야 할까요?

답변1

완료되면 파이프를 닫으면 됩니다. 하위 프로세스는 EOF에 도달하고 종료되어야 합니다.

관련 정보