Inotifywait 디렉터리에 많은 수의 파일이 있습니다.

Inotifywait 디렉터리에 많은 수의 파일이 있습니다.

내가 원하는 것은 새 파일이 생성되는지 디렉터리(재귀적이지 않고 하나만)를 모니터링하고 해당 파일이 기록될 때 큰 파일에 추가하는 것입니다.

기록되는 파일 수는 엄청나며 최대 50,000개까지 가능합니다.

예를 들어 다음을 사용하여 inotifywait디렉터리를 모니터링하고 있습니다 .

inotifywait -m -e create ~/folder | awk '($2=="CREATE"){print $3}' > ~/output.file

그래서 생성된 새 파일의 이름을 저장한 ~/output.file다음 for 루프를 사용합니다.

for FILE in `cat ~/output.file` 
do
    cat $FILE >> ~/test.out
done

파일 쓰기(생성) 속도 ~/folder가 초당 파일 1개 정도이면 제대로 작동합니다.

그러나 요구 사항이 엄청나고 파일이 생성되는 속도도 분당 500개 파일(또는 그 이상) 정도로 매우 높습니다.

프로세스가 완료된 후 파일 수를 확인했지만 ~/folder출력과 일치하지 않았습니다 inotifywait. 10~15개 정도의 파일 차이가 있으며, 사람마다 다릅니다.

게다가 루프

for FILE in `cat ~/output.file`
do
done

~/output.file모든 파일이 쓰기 시 처리되는 것은 아닙니다.

누구든지 나에게 이 문제에 대한 우아한 해결책을 제안할 수 있습니까?

답변1

다음 을 실행하면 inotifywaitoptions 를 사용하여 출력을 사후 처리할 필요가 없습니다 .--format--outfile

inotifywait -m --format '%f' -e create /home/don/folder/ --outfile /home/don/output.file

그런 다음 다른 탭을 열고 cd다음 ~/folder을 실행하십시오.

time seq -w 00001 50000 | parallel touch {}

real    1m44.841s
user    3m22.042s
sys     1m34.001s

(따라서 분당 500개 이상의 파일을 수신하고 있습니다.) 모든 것이 잘 작동하며 방금 만든 모든 파일 이름이 output.file포함되어 있습니다 . 프로세스가 디스크에 파일 쓰기를 마치면 해당 내용을 파일에 추가할 수 있습니다 (항상 켜져 있다고 가정 ).50000
test.out~/folder

xargs < /home/don/output.file cat >> test.out

또는 read파일이 생성될 때 처리하려는 경우에 사용합니다. 그래서,하지만다음 ~/folder을 실행할 수 있습니다.

inotifywait -m --format '%f' -e create ~/folder | while read file; do cat -- "$file" >> ~/test.out; done

답변2

당신이 할 수 있는 한 가지는 처리된 파일을 처리 후에 한 디렉터리에서 다른 디렉터리로 이동하는 작은 프로그램을 만드는 것입니다. 완료되면 디렉터리 검색을 다시 시작하세요. 파일이 없으면 다시 검사하기 전에 적당한 시간 동안 휴면 상태를 유지하며, 파일이 생성되는 동안 휴면 상태를 유지합니다(파일을 생성하는 프로세스는 최대 100분 정도만 실행되는 것으로 보입니다).

디렉터리에서 파일을 이동할 수 없는 경우 다른 접근 방식은 과거 어딘가의 날짜/시간 스탬프 DTS로 시작하는 것입니다. 그런 다음 DTS보다 최신인 모든 파일을 찾아서 처리하고, 파일의 타임스탬프가 DTS보다 최신이면 DTS를 업데이트합니다. 위의 해결 방법과 마찬가지로 이 과정을 반복합니다. 타임스탬프의 세분성으로 인해 두 파일이 동일하지 않은 경우 DTS보다 최신 파일만 찾을 수 있습니다. 그렇지 않은 경우 DTS보다 오래되지 않은 파일을 찾아 다음 DTS 실행 시 사용할 파일 목록을 보관하고 다음 실행 시 해당 파일을 필터링해야 합니다.

관련 정보