Определить, если файл уже открыт

Я хочу создать bash-скрипт, чтобы определить, открыт ли мой файл другим пользователем.

Я уже пробовал с lsof но это не сработало, как я хотел. Файлы могут иметь различные типы расширений, например, txt, pl, conf, cfg и т. Д. Кто-нибудь может мне помочь?

У меня есть один сервер с несколькими файлами.conf. Если я пишу в одном файле, я не могу знать, пишет ли другой пользователь в тот же файл тоже. Поэтому я хотел бы создать сценарий, который позволит мне это знать.

Я пробовал что то подобное lsof | grep MyFile или же lsof /root/blabla/myfolder/myfile и т.д. Может быть, я не понимаю, как использовать этот инструмент.

Я постараюсь объяснить мою проблему лучше. Есть много пользователей, которые могут изменить.conf файл. Если два пользователя работают с одним и тем же файлом, то при последнем сохранении данные, сделанные другим пользователем, будут перезаписаны. Мой скрипт хочет предупредить пользователей, что файл уже открыт другим пользователем, и, возможно, открыть файл в режиме только для чтения. Я уже пробовал с ps aux (спасибо за подсказку), но я не могу оценить, был ли недавно закрыт мой файл.

2 ответа

Lsof точно перечисляет все открытые файлы.

"Проблема" в том, что большинство редакторов открывают файл, читают содержимое (в оперативную память), а затем закрывают файл.

Редакторы откроют файл при записи изменений.

Чтобы увидеть, используют ли какие-либо редакторы файл, для всех пользователей запустите

ps aux | grep file name

пример

Откройте test.file с помощью nano в одном терминале.

В другом терминале запустите следующие команды:

bodhi@daemon:~$sudo lsof | grep test.file
[sudo] password for bodhi: 

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.

Примечание: нет выхода;)

Теперь запустите PS Aux

bodhi@daemon:~$sudo ps aux | grep test.file
bodhi     4736  0.0  0.0 121096  3404 pts/3    S+   17:49   0:00 nano test.file

Теперь мы видим информацию, которую хотим;)

появляется nano и мы редактируем test.file

@bodhi.zazen точно показал, почему ваши файлы не отображаются в выводе lsof.

Ну, поскольку у нас нет описания вашего варианта использования, я предполагаю, что ваш сценарий

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

Если это так, то вы можете сделать следующее:

  • получить контрольную сумму файла, который ваш скрипт намеревается изменить раньше, например: sha1sum <file>
  • сделать что-то трудоёмкое
  • проверьте текущую контрольную сумму вашего файла. Если это то же самое, что и раньше, оно не было изменено, если это не то же самое, тогда вы можете принять решение и попросить пользователя сценария решить, следует ли перезаписать или показать разницу и т. Д.

Это не идеально, и это просто выстрел в темноте, так как нам не хватает контекста, но, возможно, это будет вам как-то полезно.

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