상위 프로세스의 파이프에 데이터를 쓰고 있습니다. 상위 프로세스는 파이프에서 데이터를 읽고 이를 화면과 로그 파일에 쓰는 백그라운드 작업을 만듭니다.
백그라운드 작업을 언제 종료해야 하는지 어떻게 알 수 있나요? 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에 도달하고 종료되어야 합니다.