Определить, если файл уже открыт
Я хочу создать 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>
- сделать что-то трудоёмкое
- проверьте текущую контрольную сумму вашего файла. Если это то же самое, что и раньше, оно не было изменено, если это не то же самое, тогда вы можете принять решение и попросить пользователя сценария решить, следует ли перезаписать или показать разницу и т. Д.
Это не идеально, и это просто выстрел в темноте, так как нам не хватает контекста, но, возможно, это будет вам как-то полезно.