Это уже было задано здесь, и я нашел решение для первой части моего вопроса. Итак, на данный момент у меня есть скрипт bash (script1), где я периодически оцениваю sha1sum определенного файла (output.dat) (скажем, каждые 1 секунду). Когда sha1sum_cur != sha1sum_prev тогда я запускаю другой скрипт (script2) с некоторыми командами. Это означает, что файл был изменен.

Моя проблема в том, что output.dat довольно много МБ и требует много времени для записи. Поэтому я не хочу запускать script2 во время записи данных в него, но после завершения процесса записи данных в него. output.dat создается кодом Fortran, поэтому, скажем, каждые 1 час он удаляет предыдущие данные и записывает новые, но для этого требуется около 5 минут.

Два последних важных замечания: 1) Поскольку я отправляю свои задания в кластер, у меня нет разрешения на установку inotify-tools. 2) Я мог бы вызвать скрипт с помощью кода на Фортране, как только я close(output.txt) с помощью CALL system(./script2) но я бы предпочел этого не делать, поскольку он параллелен и не хочет снижать его эффективность.

Итак, вопрос в том, что я мог бы добавить к script1, чтобы он понимал, что процесс записи данных в output.dat завершен?

1 ответ1

0

Вы можете использовать lsof, чтобы проверить, обращается ли какой-либо процесс к этому файлу. Однако это не защитит от других процессов, изменяющих файл после того, как вы проверили доступ в своем скрипте оболочки.

Чтобы избежать условий гонки, я бы использовал атомарные файловые операции, такие как mv, чтобы отметить, что ваш сценарий оболочки или другое программное обеспечение не «подхватило» файл. Это вызов ядра, и он гарантированно будет атомарным (например, если два процесса вызывают mv для одного и того же файла одновременно, один из них будет успешным, а другой - неудачным).

Другая возможность - использовать внешний инструмент блокировки, такой как lockfile-progs, но те, которые вы не можете использовать из своего программного обеспечения, удаляют файл. mv универсален, хотя возможно грязное решение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .