순수 bash 다운로드가 완료되었는지 확인

순수 bash 다운로드가 완료되었는지 확인

간단히 말해서, 주어진 파일의 크기가 마지막 확인 이후 변경되었는지 주기적으로 확인하는 bash의 간단한 루프가 필요할 것입니다.

간단히 말해서 파일을 다운로드하겠습니다.마이파일.txt파이어폭스를 사용하세요. 나는주문하다다운로드가 완료된 후. Firefox는 제가 사용할 수 있는 dbus 호출을 제공하지 않는 것 같습니다. 위의 기능을 갖춘 몇 가지 추가 기능이 있지만 상당히 안정적인 솔루션이 필요했습니다. 그래서 bash 스크립트를 실행하여 주기적으로 확인할 수 있다고 생각했습니다.마이파일.txt시간이 지남에 따라 변화하거나 안정화되었습니다. 파일은 크기가 5MB 미만인 텍스트 파일이며 다운로드됩니다.현지의이므로 매우 안정적이며 다운로드가 선형적으로 실행되어야 합니다(연결 끊김, 서버 문제 등 없음).

이렇게 간단한 bash 스크립트를 작성하는 것을 도와주실 수 있나요? 파일을 검색하는 빈도는 작업을 효율적으로 수행하는 데 중요한 요소인 것 같습니다. 앞서 말했듯이 이는 5mb 미만의 텍스트 파일이지만 10kb만큼 작을 수 있고 SSD 드라이브에 상주할 수 있습니다.

또한 이를 달성하는 더 좋은 방법이 있을까요? 앞서 말했듯이 저는 Linux에서 실행되고 최소한의 종속성을 갖는 안정적인 솔루션이 필요했습니다. 어쩌면 다운로드 관리자일까요? 아니면 파일 모니터링 데몬이 있나요? 아니면 이를 위해 파일 시스템 API를 제공합니까? 아니면 크기 대신 액세스 시간을 사용하시겠습니까?

답변1

파일을 여는 유일한 것이 다운로드를 수행하는 프로그램이라고 가정하면 다음 명령은

/usr/sbin/lsof path/to/your/file | wc -l

파일이 아직 열려 있으면 2를 반환하고, 아무도 파일을 열지 않으면 0을 반환해야 합니다.

첫 번째 줄은 열 레이블 목록이고 두 번째 줄은 파일의 상태 줄이기 때문에 두 개입니다.

다운로드가 완료되면 누구도 파일을 열어서는 안 됩니다.

결과를 여론조사에 사용할 수 있습니다.

lsof일반적으로 admin 명령이므로 전체 경로가 필요합니다 /usr/sbin. 슈퍼유저만 사용할 수 있는 옵션이 있을 수 있지만 이는 그 중 하나가 아닙니다.

답변2

파일이 변경되지 않을 때까지 기다리고 싶다면 다음과 같이 하십시오.

 size=0
 size2=$(stat --printf=%s $filename)
 while [ $size != $size2 ]
 do
   sleep 5
   size=$size2
   size2=$(stat --printf=%s $filename)
 done

일부 C 코드를 작성할 수 있는 경우 CLOSE 이벤트에 대한 작업을 트리거할 수 있는 inotify(7) 호출 세트를 사용하는 것이 도움이 될 수 있습니다.

관련 정보