Запись файлов в фоновом режиме

Я пытаюсь создать сценарий, который будет обрабатывать измененные / новые файлы в каталоге (который зеркалируется из удаленного каталога lftp но это уже другая история).

Для отслеживания измененных файлов я использую fswatch, Затем я конвертирую файлы, обнаруженные fswatch из XML в JSON и хранить их в отдельном каталоге. Чтобы убедиться, что я могу остановить это преобразование, когда больше нет файлов для обработки (когда задание зеркалирования закончено), я отслеживаю файл, который будет создан процессом зеркалирования после завершения.

Мой сценарий работает, НО по странной причине я не вижу файлы json, пока задание зеркалирования не будет завершено. Как будто преобразованные файлы хранятся где-то в памяти, и как только условие "остановка" выполняется, эти файлы волшебным образом появляются в каталоге.

Это нормальное поведение? Как я могу сделать так, чтобы файлы появлялись сразу после их обработки? Каким образом я могу оптимизировать то, что я пытаюсь достичь? (Я новичок в Bash... и программировании в целом.)

Вот скрипт, который я использую:

my_convert_xml_to_json_function () {
    if [ -f "$1" ]; then
        temporary_file_name_for_json=$(echo "${1/$path_to_xml_files\/}" | base64)
        xml2json < "$1" | jq -rc '.amf' > "${path_to_json_files}/${temporary_file_name_for_json}.txt"
    fi
}
export -f my_convert_xml_to_json_function
export path_to_xml_files
export path_to_json_files

# repeat watching for files until the mirroring is over
fswatch -0 --event Updated --event Created "${path_to_xml_files}" | grep -ai 'xml$' | xargs -0 -n 1 -I {} bash -c 'my_convert_xml_to_json_function "{}"' & 

temporary_pid_of_fswatch=`jobs -p`
echo "This is PID of the last bit in the pipeline: $!; this is PID of the fswatch: ${temporary_pid_of_fswatch}"


# now check for the existence of a stopping rule
while [[ $(shopt -s nullglob; set -- "${my_temporary_files}"/xml-mirrorring-started-on-*-is-completed.txt; echo $#) -eq 0 ]]; do
    # tell the script to stop and remove the file generated by the mirror into the trashcan
        sleep 1 && temp_continue_check="running `date`"
        echo "Stop condition met (${temp_continue_check})."
done && kill -15 "${temporary_pid_of_fswatch}" && mv -v "${my_temporary_files}"/xml-mirrorring-started-on-*-is-completed.txt "$my_trashcan"

РЕДАКТИРОВАТЬ: так что следующий комментарий от @snorp, если я добавлю sync к сценарию, то я могу получить обновление файлов в режиме реального времени. В противном случае файлы находятся где-то в воздухе... если процесс работает в фоновом режиме, и я печатаю sync Я получаю новый процесс, который, кажется, "зависает" (основанный на top В результате я вижу, что он что-то делает, но я не вижу обработанных файлов, записанных в папку, как они должны (в конце концов) быть. Есть ли способ заставить OSX действительно записать эти файлы на диск (не включая синхронизацию в сценарии)?

0 ответов

Другие вопросы по тегам