2009-02-26 5 views
8

Je veux ouvrir un fichier qui est écrit périodiquement par une autre application. Cette application ne peut pas être modifiée. Je voudrais donc ouvrir le fichier uniquement lorsque je sais qu'il n'a pas été écrit par une autre application.Python - Comment vérifier si un fichier est utilisé par une autre application?

est-il un moyen pythonique de le faire? Sinon, comment puis-je y parvenir sous Unix et Windows?

éditer: Je vais essayer de clarifier. Y at-il un moyen de vérifier si le fichier en cours a été ouvert par une autre application?

Je voudrais commencer par cette question. Que ces autres applications en lecture/écriture ne soient pas pertinentes pour le moment.

Je me rends compte qu'il est probablement OS à charge, donc cela ne peut pas vraiment être python lié en ce moment.

+0

essayez-vous d'atteindre la rotation du journal ?? – vladr

+0

Pas exactement, mais pas trop loin. Je veux construire une application en plus d'une application existante. –

Répondre

7

Est-ce que votre désir de script python pour ouvrir le fichier pour l'écriture ou à la lecture? L'application héritée ouvre-t-elle et ferme-t-elle le fichier entre les écritures ou le garde-t-il ouvert?

Il est extrêmement important que nous comprenions ce que l'application héritée est en train de faire, et ce que votre script python tente d'obtenir.

Cette zone de fonctionnalité dépend fortement du système d'exploitation, et le fait que vous n'ayez aucun contrôle sur l'application héritée ne fait que compliquer les choses. Qu'il y ait une façon pythonique ou non pythonique de le faire sera probablement la moindre de vos préoccupations - la question difficile sera de savoir si ce que vous essayez d'accomplir sera possible du tout.


MISE À JOUR

OK, en sachant (de votre commentaire) que:

l'application héritée ouvre et la fermeture du fichier toutes les X minutes, mais je ne veulent supposer que t = t_0 + n * X + EPS il déjà fermé le dossier.

puis les paramètres du problème sont modifiés. Il peut en fait être fait de manière indépendante du système d'exploitation, en supposant quelques hypothèses ou en combinant des techniques indépendantes du système d'exploitation et indépendantes du système d'exploitation. :)

  1. manière OS indépendante: s'il est prudent de supposer que l'application héritée conserve le fichier ouvert pour au plus une certaine quantité de temps connue, disons T secondes (par exemple, ouvre le fichier, effectue une écriture , ferme le fichier), et re-ouvre plus ou moins toutes les X secondes, où X est supérieur à 2 * T.
    • stat le fichier
    • Soustraire temps de modification du fichier de now(), ce qui donne D
    • si T < = D < X puis ouvrez le fichier et faire ce que vous avez besoin avec elle
    • Cela peut être assez sûr pour votre application. La sécurité augmente au fur et à mesure que T/X diminue. Sur * nix, vous devrez peut-être vérifier à nouveau /etc/ntpd.conf pour le pas de temps approprié par rapport à la configuration de balayage (voir bricoleur). Pour Windows voir MSDN
  2. de Windows: en plus (ou en tenant lieu) de la méthode du système d'exploitation indépendant ci-dessus, vous pouvez tenter d'utiliser soit:
    • partage (verrouillage): cela suppose que le programme hérité ouvre également le fichier en mode partagé (généralement par défaut dans les applications Windows); De plus, si votre application acquiert le verrou juste au moment où l'application héritée tente la même chose (condition de concurrence), l'application héritée échouera.
      • Ceci est extrêmement intrusif et sujet aux erreurs. À moins que la nouvelle application et l'application héritée aient besoin d'un accès synchronisé pour l'écriture dans le même fichier et que vous soyez prêt à gérer la possibilité de refuser l'ouverture de l'application héritée, n'utilisez pas cette méthode.
    • essayant de savoir quels fichiers sont ouverts dans l'application héritée, en utilisant les mêmes techniques que ProcessExplorer (l'équivalent de lsof de * nix)
      • vous êtes encore plus vulnérables à des conditions de race que l'OS- technique indépendante
  3. Linux/etc.: en plus (ou en tenant lieu) de la méthode du système d'exploitation indépendant ci-dessus, vous pouvez tenter d'utiliser la même technique que lsof ou, sur certains systèmes, consultez quel fichier le lien symbolique /proc/<pid>/fd/<fdes> points
      vous
    • il est hautement improbable que l'application héritée utilise le verrouillage, mais si c'est le cas, le verrouillage n'est pas une option réelle, à moins que l'application héritée puisse gérer un fichier verrouillé bloquer, pas en cas d'échec - et si votre propre application peut garantir que le fichier ne restera pas verrouillé, en bloquant l'application héritée pour des périodes prolongées.)

MISE À JOUR 2

Si favorisant la "vérifier si l'application héritée a ouvert le fichier" (approche intrusive sujette à des conditions la course), vous pouvez résoudre cette course condition par:

  1. de vérifier si l'application existante a le fichier ouvert)
  2. répéter la vérification à l'étape 1 pour confirmer que l'application héritée n'a pas ouvert le fichier entre les étapes 1 et 2; retardez et redémarrez à l'étape 1 si c'est le cas, sinon passez à l'étape 4
  3. faites votre affaire sur le fichier - idéalement, il suffit de le renommer pour un traitement ultérieur indépendant, afin de garder l'application legacy suspendue pendant un minimum de temps
  4. Reprendre le processus d'application hérité
+0

L'application héritée ouvre et ferme le fichier toutes les X minutes, mais je ne veux pas supposer qu'à t = t_0 + n * X + eps elle a déjà fermé le fichier. –

0

Unix n'a pas de verrouillage de fichier par défaut. La meilleure suggestion que j'ai pour un environnement Unix serait de regarder les sources de la commande lsof. Il a une connaissance approfondie de quel processus ont quels fichiers s'ouvrent. Vous pouvez l'utiliser comme base de votre solution. Voici les Ubuntu sources for lsof.

+0

Cela semble être une bonne solution sous Unix. Je peux juste analyser la sortie de lsof pour le fichier dont j'ai besoin avant d'y accéder. Pas complètement sûr sans un verrou, mais je ne peux gérer l'exactitude que dans 99,99% des cas. J'ai juste besoin d'une solution pour Windows. –

0

Une chose que j'ai faite est que python renomme très temporairement le fichier. Si nous sommes en mesure de le renommer, aucun autre processus ne l'utilise. Je l'ai seulement testé sur Windows.

+1

L'expression "condition de course" vient à l'esprit: - / –