약간 특이한 사용 사례: 실제로는 데이터 스트림인 Firefox에서 파일을 다운로드했습니다. 데이터를 저장하지 않고 (거의) 실시간으로 처리하고 싶습니다(데이터가 너무 커서 내 드라이브가 빨리 가득 차게 됩니다). 다운로드되는 파일을 일종의 파이프/소켓으로 변환한 다음 어떻게든 프로그래밍 방식으로 직접 읽을 수 있는 방법이 있습니까?
지금까지 시도한 것:
스크립트가 주기적으로 파일을 다른 위치로 이동하고 이동된 파일을 버퍼로 읽은 다음 스트림을 반복적으로 읽도록 합니다. 불행하게도 이렇게 하면 다운로드가 중지됩니다(Firefox는 다운로드를 계속하지만 원본 파일을 이동한 후에는 새 .part 파일이 나타나지 않습니다).
파일(echo '' > file.part)에 쓰기만 하면 다운로드가 계속된다는 것을 알았습니다. 따라서 콘텐츠를 읽고, 파일을 덮어쓰고(공간을 채우지 않기 위해) 무한 반복할 수 있습니다. 하지만 파일을 읽고 덮어쓰는 사이에 Firefox는 동시에 더 많은 바이트를 쓰므로 스트림이 손상됩니다.
아이디어가 있나요?
댓글의 질문을 기반으로 한 몇 가지 세부 정보는 다음과 같습니다.
다운로드는 Fritzbox 웹 UI에 의해 다운로드가 시작되는 캡처(pcap) 파일입니다. fritzbox가 어떻게든 다운로드를 시작하고 컬에 사용할 수 있는 URL이 없기 때문에 컬할 수 없습니다. Firefox에서 다운로드가 "일반" 다운로드로 표시되므로 다운로드가 어떻게 작동하는지 잘 모르겠지만 크기가 설정되지 않았고 웹 UI에서 "중지"를 누를 때까지 계속 데이터가 추가됩니다.
답변1
파일 시스템이 fallocate()
시스템 호출을 지원하는 경우(예: ) ext4
, 이를 사용하여 읽은 파일 부분을 0으로 만들 수 있으며 파일이부족한.
예를 들어:
file=/tmp/somefile
length=4096
offset=0
tail -n +1 -f "$file" |
while timeout 5 dd status=none count=1 bs=$length
do fallocate --punch-hole -o $offset -l $length $file
let offset=offset+length
done |
myprogram
tail
이 쉘 스크립트는 블록 0에서 파일을 읽고 데이터를 dd
개별 블록으로 파이프한 다음 프로그램으로 파이프하는 데 사용됩니다 . 그런 다음 유틸리티를 사용하여 fallocate
블록을 0으로 만듭니다.
Firefox에서 작성하는 파일의 크기가 커지는 것을 보여 주지만 ls -ls $file
첫 번째 숫자(사용된 블록 수)는 0에 가까울 것입니다(루프가 계속 유지된다고 가정). 필요한 경우 길이를 늘려 파일 시스템 블록 크기의 배수로 유지합니다. timeout
최종 파일 끝 문자를 감지 하는 데 사용되며 확장이 필요할 수 있습니다.