Использование lsof
Чтобы проверить, есть ли у какого-либо процесса открытый файл, скажем, path/to/input_gate
, выполните команду:
lsof path/to/input_gate
Это завершится с кодом 0, если есть процесс, использующий файл, и кодом 1, если никакая обработка не использует его (или произошла ошибка). Этот код выхода может использоваться командами оболочки.
тестирование
Чтобы проверить это, давайте создадим процесс, чтобы открыть наш файл:
sleep 10 >>path/to/input_gate &
Это будет держать файл открытым в течение 10 секунд. Чтобы проверить lsof
, быстро выполните следующую команду:
$ if lsof path/to/input_gate >/dev/null; then echo "In use"; else echo "Not in use"; fi
In use
Подождите 10 секунд и попробуйте снова:
$ if lsof path/to/input_gate >/dev/null; then echo "In use"; else echo "Not in use"; fi
Not in use
Ожидание, пока файл не будет готов
Если вы хотите подождать, пока файл не будет использован другим процессом:
while lsof path/to/input_gate >/dev/null; do sleep 1; done; echo "Finally, not in use"
Использование inotifywait
Если ваша система поддерживает inotifywait
(система linux должна), то можно найти близкие события в интересующем файле:
inotifywait "path/to/input_gate" -e close
Приведенная выше команда будет блокироваться, пока какой-либо процесс не закроет файл.
Преимущество такого подхода состоит в том, что он исключает опрос.
Недостаток этого подхода заключается в том, что он в первый раз уведомит вас о том, что какой-то процесс закрывает файл, и это может отличаться от того, что все процессы закрыли файл.