OEL 6의 bash 스크립트에서 여러 파일을 정렬하고 있습니다.
for f in /share/scripts/stats/*.stat; do (cat "${f}"; echo) >> /share/scripts/stats/finalmail.html; done
스크립트가 수동으로 실행되면 모든 파일이 완벽하게 추가됩니다. 그러나 스크립트가 cron에서 실행되면(5분마다) 때로는(시간의 약 10%) 1-2개 파일의 부분 데이터만 추가됩니다. 이 cat 작업을 호출하기 전에 각 파일의 크기를 나열하려고 합니다. 최종 파일 크기가 모든 파일 크기의 합이 아닐 수도 있습니다.
답변1
대부분의 경우 파일을 쓰는 동안 스크립트가 실행되는 경우가 있습니다. 실행하면 cat
현재 존재하는 데이터를 복사합니다. 나중에 더 많은 데이터가 추가될지 알 수 없습니다.
이를 방지하려면 파일을 빠르게 생성하려는 경우 가장 좋은 방법은 데이터를 생성하는 프로그램을 변경하는 것입니다. 최종 이름을 직접 쓰는 대신 임시 파일에 쓰고 모든 데이터가 있으면 임시 파일의 이름을 바꿉니다.
gather_data --origin=somewhere >somewhere.stat.tmp &&
mv somewhere.stat.tmp somewhere.stat
빌드 프로세스를 변경할 수 없는 경우 다음을 사용하여 닫히는 파일에 반응할 수 있습니다.inotify. 이러한 파일이 생성되고 삭제되는 방식에 따라 다음을 사용하는 것이 더 합리적일 수 있습니다.잉크론, 예를 들어 다음 incrontab 줄을 사용할 수 있습니다.
/share/scripts/stats IN_CLOSE_WRITE case $@/$# in *.stat) new_stat_file $@/$# esac
new_stat_file
새 파일을 포함하는 스크립트가 됩니다. cat *.stat
부분 파일도 얻을 수 있으므로 이와 같은 것을 실행하지 마십시오 . 파일 이름이나 파일 복사본의 이름을 바꿉니다.
/share/scripts/stats IN_CLOSE_WRITE case $@/$# in *.stat) ln $@/$# /share/scripts/stats/ready/; esac
/share/scripts/stats/ready
그런 다음 대신 파일을 가져오십시오 /share/scripts/stats
.