!["read"를 사용하여 fifo에서 읽을 때 시간 초과가 발생하지 않습니다.](https://linux55.com/image/24194/%22read%22%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20fifo%EC%97%90%EC%84%9C%20%EC%9D%BD%EC%9D%84%20%EB%95%8C%20%EC%8B%9C%EA%B0%84%20%EC%B4%88%EA%B3%BC%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
이 코드를 보세요:
while read -t 3 line; do
echo ${line}
done < /opt/data.log
data.log
선입선출 방식입니다. 프로세스가 여기에 쓰고 있으며 코드는 이를 읽어 사용자에게 표시해야 합니다. 하지만 3초 이내에 fifo에 더 이상 데이터가 없으면 종료하고 싶습니다.
문제는 결코 시간이 초과되지 않는다는 것입니다. 나는 이 fifo에 글을 쓰고 다음과 같은 내용을 보여줍니다.
read: 6: Illegal option -t
뭐가 문제 야?
[고쳐 쓰다]
예, 저는 /bin/sh
심볼릭 링크인 shebang을 사용하고 있습니다 dash
. 으로 바꿨 /bin/bash
는데 소용이 없었습니다. 아무도 fifo를 열지 않으면 영원히 기다립니다. FIFO의 다른 쪽 끝이 열리지 않을 때 작동하는 시간 초과 솔루션을 원합니다.
답변1
배쉬를 사용하고 있나요? 또는 다른 것? read -t
kshism입니다(bash와 zsh도 지원하지만 표준은 아닙니다).
bash에서는 작동하지만 대시에서는 작동하지 않습니다.
$ bash -c 'echo foo | bash는 동시에 -t 3 xxxx를 읽습니다.' 부자
$ dash -c 'echo foo | 또한 읽기 -t 3 xxxx; 대시: 1: 읽기: 잘못된 옵션 -t
답변2
나는 이것을 수행하는 좋은 방법을 찾았습니다.
exec 5<>/opt/data.log
while read -7 3 line <& 5; do
echo ${line}
done
스크립트가 영원히 차단되지 않도록 읽기 및 쓰기용으로 엽니다. 설명은 다음과 같습니다. https://stackoverflow.com/a/4875924/654269