web-dev-qa-db-fra.com

Existe-t-il un moyen plus rapide de vérifier si un fichier est en cours d'utilisation?

Je recherche une fonction de ligne de commande ou une fonction c qui me permette de savoir si un fichier est ouvert/utilisé par quelque chose.

lsof et fuser le disent, mais ils fournissent beaucoup d’autres informations qui peuvent prendre 300 ms dans certaines situations (comme lorsque j’utilise ce code sur MAC OS X, je travaille sous Linux et OS X) une solution Windows qui prend 5 ms alors j'essaie de trouver quelque chose dans Unix qui est également très rapide et qui renvoie simplement true ou false si le fichier est en cours d'utilisation)

8
Noitidart

Si vous utilisez ceci comme verrou, cela ne fonctionnera pas car ni lsof ni fuser n'empêcheront les conditions de concurrence.

Le processus de base que lsof effectue consiste à parcourir tous les processus /proc/*/fs à la recherche de descripteurs de fichiers ouverts. Cela va prendre du temps, peu importe ce que vous faites.

Vous pouvez le faire vous-même, mais ce ne sera probablement pas plus rapide, car vous devez vérifier chaque processus ouvert sur le système.

Si votre temps est critique, trouvez une autre façon de le faire.

  • Si vous contrôlez le fichier via un programme que vous avez écrit; utiliser un fichier de verrouillage.
  • Si vous exécutez une commande qui opère sur le fichier, recherchez la documentation proposée par la commande/programme et voyez si elle ne peut pas créer de fichier de verrouillage. À défaut, voyez s'il ne peut pas créer un fichier avec son PID à l'intérieur. Ensuite, vous pouvez regarder /proc/<PID>/fs pour voir si votre fichier est actuellement ouvert ou non. Si vous ne regardez qu'un processus, les descripteurs de fichier ouverts seront beaucoup plus rapides que la correspondance entre eux.
  • Sinon, pour vous aider, je vais avoir besoin de plus d’informations sur ce que vous faites.

Dans un commentaire, vous avez indiqué que vous souhaitez déterminer si Firefox est exécuté sur un système donné. La meilleure façon de faire est de rechercher les fichiers de verrouillage de Firefox. Ceux-ci sont stockés dans emplacements par défaut spécifiés sur le wiki de Mozilla.

Par exemple, sous Linux, demandez à votre programme de procéder comme suit:

  • ouvrez le répertoire ~/.mozilla/firefox/.
  • Répertoriez tous les répertoires en filtrant les répertoires se terminant par .default. (Je pense que tous les profils se terminent par .default, sinon simplement dans chaque répertoire.)
  • Dans chaque répertoire ci-dessus, recherchez l'existence d'un fichier nommé lock ou .parentlock. Si vous voyez un ou les deux fichiers, Firefox est ouvert.

Cet algorithme devrait s'exécuter plus rapidement que ce que vous faites actuellement sur Windows.

9
nixeagle

TL; DR

Dans n de vos commentaires , vous déclarez:

Ma situation exacte est la suivante: j'ai le chemin d'accès à un fichier. Il est verrouillé si Firefox est en cours d'exécution. Je veux voir si son verrouillé ou ne pas dire si Firefox est en cours d'exécution.

Votre question initiale sur lockfiles semble être un long chemin à parcourir lorsqu'il existe des moyens plus simples de savoir si Firefox est en cours d'exécution pour un utilisateur donné et d'inspecter l'état de son processus.

État du processus d'examen

Un moyen plus judicieux de trouver le PID d’un processus donné consiste à utiliser pgrep à partir du procps package. Par exemple:

$ pgrep -u $LOGNAME firefox
5671

Vous pouvez ensuite inspecter l'état du PID avec ps :

$ ps 5671
  PID TTY      STAT   TIME COMMAND
 5671 ?        Sl   105:47 /usr/lib/firefox/firefox

ou juste obtenir les drapeaux d'état sans autre crue:

$ ps -ho stat $(pgrep -u $LOGNAME firefox)
Sl

Un de mes systèmes, le one-liner ci-dessus ne prend systématiquement que 1,4 millisecondes. Votre kilométrage peut varier.

Codes d'état de processus

La section PROCESS STATE CODES de ps (1) détaille la signification des différents indicateurs d'état. Sur Ubuntu 14.04, la page de manuel dit:

PROCESS STATE CODES
       Here are the different values that the s, stat and state output
       specifiers (header "STAT" or "S") will display to describe the state of
       a process:

               D    uninterruptible sleep (usually IO)
               R    running or runnable (on run queue)
               S    interruptible sleep (waiting for an event to complete)
               T    stopped, either by a job control signal or because it is
                    being traced
               W    paging (not valid since the 2.6.xx kernel)
               X    dead (should never be seen)
               Z    defunct ("zombie") process, terminated but not reaped by
                    its parent

       For BSD formats and when the stat keyword is used, additional
       characters may be displayed:

               <    high-priority (not Nice to other users)
               N    low-priority (Nice to other users)
               L    has pages locked into memory (for real-time and custom IO)
               s    is a session leader
               l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads
                    do)
               +    is in the foreground process group
1
CodeGnome