명명된 파이프로 보내는 동안 프로세스가 예기치 않게 종료되었습니다.

명명된 파이프로 보내는 동안 프로세스가 예기치 않게 종료되었습니다.

두 개의 프로세스와 명명된 파이프가 있습니다.

한 프로세스는 파이프에서 데이터를 적극적으로 읽고, 다른 프로세스는 지속적으로 파이프에 데이터를 보냅니다.

파이프로 전송되는 명령은 다음과 같습니다.

sudo iotop -b -P > diskfifo

반면에 리더는 파이프에서 루프 읽기 작업을 수행합니다.

pipe=./diskfifo

while read line <$pipe
do
    if [[ "$line" == 'quit' ]]; then
        break
    fi
    echo $line
done

문제: iotop 명령이 특정 횟수의 반복 후에 중지되는 경우가 있는데 그 이유를 이해할 수 없습니다.

그런데 전송되는 데이터의 양을 줄여도 iotop 명령이 중지되지 않는 것을 확인했습니다.

답변1

루프가 반복될 때마다 read파이프는 읽기 위해 열리고 데이터 행을 읽은 다음 닫힙니다.

파이프에서 적극적으로 읽지 않고 파이프에 쓰려고 결정하면 iotop아무도 읽지 않는 파이프에 쓰려고 하기 때문에 신호를 받게 됩니다. 신호 수신 시 기본 동작은 프로세스를 종료하는 것입니다.readPIPEPIPE

루프에서 읽기 위해 파이프를 열고 닫는 대신(그리고 iotop파이프를 읽지 않을 때 파이프에 기록되지 않기를 바라면서) 파이프의 입력을 루프 자체로 리디렉션합니다.

pipe=./diskfifo

while read word; do
    [ "$word" = 'quit' ] && break
    printf '%s\n' "$word"
done <"$pipe"

이렇게 하면 루프 전체에서 파이프가 열린 상태로 유지됩니다. 각 호출은 read파이프에 연결된 루프의 표준 입력에서 표준 입력 스트림을 상속합니다.


루프에 대해 가능한 다른 표현식:

while read word && [ "$word" != 'quit' ]; do
    printf '%s\n' "$word"
done <"$pipe"

관련 정보