cat 스크립트의 여러 파일은 cron에서 예약할 때 데이터를 자릅니다.

cat 스크립트의 여러 파일은 cron에서 예약할 때 데이터를 자릅니다.

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.

관련 정보