2010-03-26 6 views

Répondre

9

J'ai trouvé un bien meilleur moyen. Avec lsof (testé sur la version 4,63), vous pouvez interroger directement un fichier spécifique:

if lsof filename > /dev/null; then 
    # file is open 
fi 
2

Eh bien, vous pouvez sauter wc et utiliser la valeur de retour de grep (grep retourne 0 (succès) si elle détecte le motif et 1 (non-succès) si elle ne détecte pas le motif):

if lsof | grep filename > /dev/null; then 
    # filename is in output of lsof 
fi 

Vous pouvez améliorer cela un peu en utilisant -l drapeau grep:

if lsof | grep -l filename > /dev/null; then 
... 

cela dit grep d'arrêter de regarder une fois qu'il détecte est le premier match.

+0

Si vous vous souciez vraiment du processus qui utilise le fichier, mieux vaut utiliser l'option '-m 1' pour grep afin d'obtenir la ligne correspondante au lieu du nom de fichier (stdin) dans lequel la correspondance a été trouvée. belle utilisation alternative de '-l'.) – Cascabel

1

Utilisez fuser. Il renvoie non-zéro si l'un des fichiers spécifiés est utilisé, et zéro s'ils sont tous disponibles.

1

Ne pas. La réponse peut changer au moment où vous essayez de faire quelque chose avec le résultat. Au lieu de cela, essayez de faire ce que vous avez l'intention de faire avec le fichier et de gérer l'erreur "en cours d'utilisation" ou "violation de partage".

+0

Pour vous: +1, d'après ce que je vois, je pense que vous pourriez avoir raison. Bien que votre réponse ne répond pas spécifiquement à la question. – jjclarkson

+0

Jared Parsons a un bon article sur pourquoi la question elle-même est fondamentalement défectueuse: http://blogs.msdn.com/jaredpar/archive/2009/12/10/the-file-system-is-unpredictable.aspx Dans de tels cas, il est préférable de ne pas répondre à la question qui a été posée, mais à la question qui aurait dû être posée. –

+0

-1 pour plusieurs raisons. Premièrement, la réponse «ne pas» est * aussi * naïve et malavisée. Il existe plusieurs raisons légitimes de vouloir interroger directement si les fichiers sont ouverts ou si des verrous consultatifs sont conservés, tels que le débogage, la surveillance ou l'avertissement d'un utilisateur à l'avance qu'ils ne seront peut-être pas en mesure d'enregistrer leurs modifications. Deuxièmement, les pointeurs de fichiers sous Unix n'imposent aucun type de verrouillage par défaut; À moins que vous n'utilisiez explicitement 'flock' ou un autre mécanisme de verrouillage, vous n'obtiendrez * aucune * erreur de type" in use "ou" sharing violation "- vous vous contenterez d'amuser votre fichier. –

Questions connexes