web-dev-qa-db-fra.com

Déterminer si un fichier est déjà ouvert

Je veux créer un script bash pour déterminer si mon fichier est déjà ouvert par un autre utilisateur.

J'ai déjà essayé avec lsof mais cela n'a pas fonctionné comme je le voulais. Les fichiers peuvent avoir différents types d'extension, par exemple txt, pl, conf, cfg etc. Quelqu'un peut-il m'aider?

J'ai un serveur avec de nombreux fichiers .conf. Si j'écris dans un fichier, je ne peux pas savoir si un autre utilisateur écrit aussi dans le même fichier. Je voudrais donc construire un script qui me le fasse savoir.

J'ai essayé quelque chose comme ça lsof | grep MyFile ou lsof /root/blabla/myfolder/myfile etc. Peut-être que je ne comprends pas l'utilisation de cet outil.

je vais essayer de mieux expliquer mon problème. De nombreux utilisateurs peuvent modifier le fichier .conf. Si deux utilisateurs travaillent sur le même fichier, la dernière sauvegarde écrase la modification effectuée par l'autre utilisateur. Mon script veut avertir les utilisateurs que le fichier est déjà ouvert par un autre utilisateur et peut-être ouvrir le fichier en mode lecture seule. J'ai déjà essayé avec ps aux (merci pour l'astuce) mais je ne peux pas estimer si mon dossier a été récemment fermé.

1
Andrea P

lsof répertorie avec précision tous les fichiers ouverts.

Le "problème" est que la plupart des éditeurs ouvrent le fichier, lisent le contenu (dans la mémoire RAM), puis ferment le fichier.

Les éditeurs ouvriront ensuite le fichier lors de l'écriture des modifications.

Pour voir si des éditeurs utilisent le fichier, pour tous les utilisateurs, exécutez

ps aux | grep file name

Exemple

Ouvrez un fichier test.file avec nano dans un terminal.

Dans un autre terminal, exécutez les commandes suivantes:

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.

Remarque: pas de sortie;)

Maintenant, lancez 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

Maintenant, nous voyons les informations que nous voulons;)

nano apparaît et nous éditons test.file

1
Panther

@ bodhi.zazen a montré avec précision la raison pour laquelle vos fichiers ne sont pas affichés dans la sortie de lsof.

Eh bien, comme il nous manque une description de votre cas d'utilisation, je suppose que votre script

  • fait quelque chose qui prend du temps
  • modifie le contenu des autres fichiers qui peuvent avoir été modifiés entre le moment où votre script démarre et le moment où il est prêt à modifier le fichier.

Si tel est le cas, vous pouvez notamment:

  • obtenir la somme de contrôle du fichier que votre script a l'intention de modifier tôt avec, par exemple: sha1sum <file>
  • faire quelque chose de long
  • vérifiez la somme de contrôle actuelle de votre fichier. Si c'est la même chose qu'avant, elle n'a pas été modifiée, si ce n'est pas la même chose, vous pouvez alors prendre une décision et demander à l'utilisateur du script de décider s'il faut écraser ou afficher un diff, etc.

Ce n'est pas idéal et c'est juste un coup dans le noir car il nous manque le contexte mais peut-être que cela vous sera utile d'une manière ou d'une autre.

0
Marcin Kaminski