2012-03-06 3 views
0

이것은 언어 별 문제보다 일반적인 질문입니다. 나는 csv 파일을 자동으로 처리하는 프로그램을 구현해야한다 (파일 읽기, 데이터베이스 쓰기, 파일 이동). 이것은 전혀 문제가되지 않습니다.처리해야 할 새 파일을 확인하는 가장 좋은 방법

문제는 다음과 같습니다. 디렉토리 구조 다음과 같이 처리해야하는 새 파일이있는 경우 정기적으로 확인해야합니다 (5 분 정도 될 것입니다) ...

-+ basedir 
--+ AT (ISO country abbreviation ...) 
--+ DE 
---+ ID1234 (directory for user) 
---+ ID2345 
---+ ID4523 
---+ ... 

각 디렉토리를 매우 효율적으로 수행하는 방법을 알고 있습니까? 모든 디렉토리에서 루프를 수행하고 스캔하는 것이 좋다고 생각하지 않습니다.

파일은 FTP를 통해 업로드되며 서버를 완벽하게 제어 할 수 있습니다.

답변

2

는 스캔 할 하위 디렉토리를 많이 가지고 특히, 좋은 생각이다. tail은 폴링 솔루션의 오버 헤드를 피하고 파일을 찾을 위치를 정확하게 알려줍니다. 하지만 그것은 PHP보다 셸을 사용하여 더 쉽게 얻을 수있는 것이라고 생각합니다.

나는이 같은 라인이 포함 로그를 생성 한 서버에 VSFTPD 한

:

#!/bin/sh 

tail -F /var/log/vsftpd.log | while read junk junk junk junk junk junk junk user status command junk sourceip file junk; do 
    if [ "$command" = "UPLOAD:" -a "$status" = "OK" ]; then 
    if echo "$file" | grep -q '/path/to/.*\.txt'; then 
     # do some triggered action, like: 
     sql="INSERT INTO log VALUES ('$user', '$sourceip', '$file')" 
     if mysql -uusername -ppasswd -Ddbname -e"$sql"; then 
     filename="`echo \"$file\" | sed -r 's/\"(.*)\",$/\\1/'`" 
     mv "$filename" /path/to/donefiles/ 
     fi 
    fi 
    fi 
done 
:

Fri Feb 24 05:37:43 2012 [pid 86561] [bob] OK UPLOAD: Client "10.2.3.4", "/path/to/file.txt", 6036 bytes, 32.77Kbyte/sec 

이 기반으로 작업을 트리거하기를, 나는 다음과 같이 쉘 스크립트를 사용할 수

이것은 OS의 일반적인 시동 설비를 사용하여 시작하거나 @reboot 스페셜을 사용하여 cron으로 시작할 수 있습니다.

취향에 따라 오류 처리 기능을 추가하십시오.

+0

아주 좋은 소리입니다. 그걸 확인해야 해. 그 사이에 고마워요 .--)! – thedom

0

ftp에 대한 로깅을 설정하고 새로운 이벤트에 대한 로그를 구문 분석 할 수 있습니다. FTP 서버의 로그를보고

또는 inotify를, fschange, 감사, 같은 것을 시도 ...

관련 문제