Split이 Bash에서 이상하게 동작합니다.

Split이 Bash에서 이상하게 동작합니다.

inotifywait와 함께 분할을 사용해 보십시오. 기본적으로 FTP 서버에서 파일이 생성될 때 파일이 분할됩니다.

#!/bin/bash

TARGET=/home/test-directory/incoming
SPLITTED=/home/test-directory/incoming/splitted
PROCESSED=/home/test-directory/incoming/processed
LOGFILE=/var/log/inotify-ftp.log

inotifywait -m -e create -e moved_to --format "%f" $TARGET \
        | while read FILENAME
                do
                        echo Detected $FILENAME >> $LOGFILE
                        echo Splitting $FILENAME >> $LOGFILE
                        split -d -l 1000 "$TARGET/$FILENAME" "$SPLITTED/$FILENAME"
                        #/usr/bin/split -d -l 1000 /home/test-directory/incoming/test-file.csv /home/test-directory/incoming/splitted/test-file.csv
                        mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME"
                        echo Completed splitting $FILENAME >> $LOGFILE
                done

따라서 아래 코드는 단독으로 실행해도 잘 작동합니다. 위 스크립트는 동일한 작업을 수행해야 하지만 길이가 수백 줄에 불과한 첫 번째 분할 파일을 생성합니다.

#/usr/bin/split -d -l 1000 /home/test-directory/incoming/test-file.csv /home/test-directory/incoming/splitted/test-file.csv

무슨 일이 일어났나요?

답변1

이는 파일 길이가 0으로 생성되었기 때문입니다. 분할이 파일 크기를 파악하고 분할 방법을 결정하는 반면 ftp 서버는 기꺼이 파일 크기를 계속 늘리는 경쟁 조건이 있습니다.

분할이 읽기를 시작하기 전에 파일이 완전히 도착할 때까지 기다리는 메커니즘을 마련하는 것이 현명할 것입니다. 일반적으로 통계 파일은 이전 1분 동안 증가가 멈출 때까지 반복됩니다.

답변2

이미 설명했듯이다른 곳에서create추가되는 콘텐츠를 참조하지 않고 파일이 생성되면 이벤트가 시작됩니다 . 파일 전송 서비스에서 파일을 닫을 때까지 이벤트가 실행되지 않도록 이벤트를 변경 inotifywait합니다 .createclose_write

inotifywait -m -e close_write -e moved_to --format "%f" "$TARGET"

또한 프로세스가 완전히 전송된 파일과 도중에 중단된 파일을 구별할 수 있도록 몇 가지 오류 처리 기능을 구축해야 합니다. 이는 파일 내용의 유효성을 확인하거나 tmp전송 성공 시 보낸 사람이 파일 이름을 바꿀 때 제거된 접미사를 사용하여 파일을 전송할 수 있습니다.

마지막으로, 좋은 코딩 방법으로 변수를 사용할 때마다 큰따옴표로 묶어야 한다는 점을 기억하세요.

관련 정보