Как получить контроль над файлами в Linux перед началом обработки - bash - PullRequest
0 голосов
/ 24 мая 2018

В настоящее время я работаю над проектом по автоматизации ручного задания в моем офисе.У нас есть процесс, который мы должны повторно активировать некоторые из наших идентификаторов, когда они падают в ремонте.В рамках этого процесса мы должны извлечь эти идентификаторы из таблицы DB Oracle, а затем поместить файл на наш сервер Linux и выполнить команду, подобную этой:

Пример файла:

$cat /task/abc_YYYYMMDD_1.txt
23456
45678

... и т. Д.

cat abc_YYYYMMDD_1.txt | scripttoprocess -args

Я использую существующий код на основе Java, называемый «scripttoprocess».Я не вижу, что находится внутри этого кода, поскольку он зашифрован (кажется) в моем скрипте.Я просто иду в то место, где присутствуют мои файлы, и затем использую его так:

cd /export/incoming/task
for i in `ls abc_YYYYMMDD*.txt`;do 
cat $i | scripttoprocess -args
if [ $? -eq 0];then
mv $i /export/incoming/HIST/
fi
done

scripttoprocess is и существующий скрипт.Я просто называю это своим собственным сценарием.Мой скрипт работает постоянно в фоновом режиме.Он просто ищет файл abc_YYYYMMDD_1.txt в каталоге / task и, если обнаруживает такой файл, начинает обработку файла.Но я заметил, что мой сценарий начинает обрабатывать файл задолго до того, как он будет полностью записан, и иногда перемещает файл в HIST без полной его обработки.

Как справиться с этой ситуацией.Я хочу быть полностью уверенным, что файл полностью записан, прежде чем я начну его обрабатывать.Во-вторых, есть ли способ получить контроль над файлом, например, подготовка контрольного файла, который содержит список файлов, которые находятся в каталоге / task.И тогда я могу отследить этот контрольный файл и выбрать имена файлов из него?Ваше руководство будет высоко ценится.

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Я согласен с @TenG, обычно вы не должны перемещать файл до тех пор, пока он не будет полностью записан.Если вы точно знаете, что файл закончен (как файл вчерашнего дня), вы можете безопасно переместить его, в противном случае вы можете обработать его, но не переместить его.Например, вы можете обработать его часть и запомнить количество обработанных строк, чтобы в следующий раз не перезапускать с нуля.

Если вы действительно хотите работать с файлами, находящимися «в процессе»,иногда tail -F работает для этого случая, но тогда ваш bash-скрипт также является непрерывным процессом, а не работой, и вам нужно управлять им.

Вы также можете проверить, открыт ли файл в данный момент (итаким образом, не завершено), используя lsof (см. https://superuser.com/questions/97844/how-can-i-determine-what-process-has-a-file-open-in-linux; , проверьте, открыт ли файл с помощью lsof ).

0 голосов
/ 24 мая 2018

Изменить процесс, который извлекает идентификаторы из таблицы Oracle.Вы можете использовать mv как прокомментированный @TenG, или добавить что-то особенное в файл, который показывает, что работа сделана:

#!/bin/bash
source file_that_runs_sqlcommands_with_credentials
output=$(your_sql_function "select * from repairjobs")
# Something more for removing them from the table and check the number of deleted records
printf "%s\nFinished\n" "${output}" >> /task/abc_YYYYMMDD_1.txt

или

#!/bin/bash
source file_that_runs_sqlcommands_with_credentials
output=$(your_sql_function "select * from repairjobs union select 'EOF' from dual")
# Something more for removing them from the table and check the number of deleted records
printf "%s\n" "${output}" >> /task/abc_YYYYMMDD_1.txt
0 голосов
/ 24 мая 2018

Я использовал

iwatch -e close_write -c "/usr/bin/pdflatex -interaction batchmode %f" document.tex

Для запуска команды (преобразование латекса в PDF), когда файл (document.tex) закрыт после записи в него, что вы также можете сделать.

Однако есть предостережение: это было предназначено только для ручного редактирования файла, и ошибка не была критической.Следовательно, это игнорирует случай, когда сразу после закрытия он открывается и записывается снова.Спросите себя, достаточно ли это для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...