![명명된 파이프로 보낼 때 프로세스가 예기치 않게 종료됩니다.](https://rvso.com/image/154468/%EB%AA%85%EB%AA%85%EB%90%9C%20%ED%8C%8C%EC%9D%B4%ED%94%84%EB%A1%9C%20%EB%B3%B4%EB%82%BC%20%EB%95%8C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%80%20%EC%98%88%EA%B8%B0%EC%B9%98%20%EC%95%8A%EA%B2%8C%20%EC%A2%85%EB%A3%8C%EB%90%A9%EB%8B%88%EB%8B%A4..png)
두 개의 프로세스와 하나의 명명된 파이프가 있습니다.
한 프로세스는 파이프에서 적극적으로 읽고 있고, 다른 프로세스는 지속적으로 파이프에 데이터를 보내고 있습니다.
파이프로 보내는 명령은 다음과 같습니다.
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
동안 파이프에 쓰기를 시도하기로 결정 하면 아무도 읽지 않는 파이프에 쓰기를 시도하므로 신호를 받게 됩니다. 신호 수신 시 기본 동작 은 프로세스를 종료하는 것입니다.read
PIPE
PIPE
루프에서 읽기 위해 파이프를 열고 닫는 대신( 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"