Determinar se um arquivo já está aberto

1

Eu quero criar um script bash para determinar se meu arquivo já está aberto por outro usuário.

Eu já tentei com lsof , mas não funcionou como eu queria. Os arquivos podem ter diferentes tipos de extensão, por ex. txt, pl, conf, cfg etc. Alguém pode me ajudar?

Eu tenho um servidor com muitos arquivos .conf. Se eu escrevo em um arquivo, não sei se outro usuário escreve no mesmo arquivo também. Então eu gostaria de criar um script que me avise.

Eu tentei algo assim lsof | grep MyFile ou lsof /root/blabla/myfolder/myfile etc. Talvez eu não entenda o uso dessa ferramenta.

Vou tentar explicar melhor o meu problema. Existem muitos usuários que podem modificar o arquivo .conf. Se dois usuários trabalharem no mesmo arquivo, o último salvamento substituirá a alteração feita pelo outro usuário. Meu script quer avisar os usuários que o arquivo já está aberto por outro usuário e talvez abrir o arquivo no modo somente leitura. Eu já tentei com ps aux (thx para a dica) mas não posso estimar se meu arquivo foi fechado recentemente.

    
por Andrea P 15.05.2015 / 23:28

2 respostas

1

lsof lista com precisão todos os arquivos abertos.

O "problema" é que a maioria dos editores abre o arquivo, lê o conteúdo (em ram) e fecha o arquivo.

Os editores abrirão o arquivo ao escrever as alterações.

Para ver se algum editor está usando o arquivo, para todos os usuários, execute

ps aux | grep file name

Exemplo

Abra um teste.file com nano em um terminal.

Em outro terminal, execute os seguintes comandos:

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.

Nota: sem saída;)

Agora execute 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

Agora vemos as informações que queremos;)

nano aparece e estamos editando o arquivo test.file

    
por Panther 16.05.2015 / 01:53
0

@ bodhi.zazen mostrou com precisão qual a razão de seus arquivos não serem mostrados na saída do lsof.

Bem, como não temos uma descrição do seu caso de uso, presumimos que o seu script

  • faz algo que leva tempo
  • altera o conteúdo de outros arquivos que podem ter sido modificados entre o momento em que o script é iniciado e o momento em que ele está pronto para alterar o arquivo.

Se este for o caso, uma coisa que você pode fazer é:

  • obtenha a soma de verificação do arquivo que seu script pretende modificar antecipadamente, por exemplo: sha1sum <file>
  • faça algo que consome tempo
  • verifique a soma de verificação atual do seu arquivo. Se for o mesmo de antes, ele não foi modificado, se não for o mesmo, você pode então tomar uma decisão e pedir ao usuário do script para decidir se deseja sobrescrever ou mostrar um diff, etc.

Não é ideal e é apenas um tiro no escuro, já que estamos perdendo o contexto, mas talvez seja útil de alguma forma para você.

    
por Marcin Kaminski 16.05.2015 / 02:11