您的python脚本是否希望打开文件以供书写或阅读?遗留应用程序是在写入之间打开还是关闭文件,还是保持打开状态?
我们理解遗留应用程序正在做什么以及您的python脚本试图实现什么是非常重要的。
这个功能区域与操作系统高度相关,而且您无法控制遗留应用程序的事实只会让事情变得更加困难。无论是pythonic还是非pythonic这样做的方式可能是你最担心的问题 - 难的问题将是你想要达到什么将是可能的。
UPDATE
好了,知道(从您的评论)说:
遗留应用程序的打开和 关闭每隔X分钟的文件,但 我不想假设在t = t_0 + n * X + eps它已经关闭了 该文件。
然后问题的参数被改变。实际上,可以在一些假设条件下以独立于操作系统的方式完成,或者作为操作系统相关和操作系统无关的技术的组合。 :)
- OS无关的方式:如果它是安全的假设,遗留应用程序保持文件打开的最多的时候一些已知量,说
T
秒(如打开文件,执行一个写,然后关闭该文件),并且每隔X
秒或多或少地重新打开它,其中X
大于2 * T
。
stat
文件
- 减去从
now()
文件的修改时间,产生D
- 如果
T
< = D
< X
然后打开该文件,你需要用它
- 什么这可能是足够安全为您的应用程序。随着
T
/X
的减少,安全性增加。在* nix上,您可能需要仔细检查/etc/ntpd.conf
,以确定正确的时间步长和摆动配置(请参阅修补程序)。对于Windows看到MSDN
- 的Windows:除了(或-代替)以上的操作系统无关的方法,你可以尝试使用两种:
- 共享(锁定):这个假设传统程序也以共享模式打开文件(通常是Windows应用程序中的默认文件);此外,如果您的应用程序像传统应用程序尝试相同(争用条件)一样获取锁定,则传统应用程序将失败。
- 这是非常侵入性和容易出错的。除非新应用程序和旧应用程序都需要同步访问才能写入同一文件,并且您愿意处理遗留应用程序被拒绝打开文件的可能性,否则请勿使用此方法。
- 试图找出哪些文件是在传统的应用程序中打开,使用相同的技术ProcessExplorer(相当于* nix中的
lsof
)
- 的Linux /等。:除了(或同代替)上述操作系统无关的方法,则可能尝试使用相同的技术
lsof
或,在某些系统中,只需查看哪个文件符号链接/proc/<pid>/fd/<fdes>
指向
- 你比独立于操作系统的技术更容易受到竞争条件的影响
- 传统应用程序使用锁定的可能性很小,但如果是这样,锁定不是真正的选择,除非传统应用程序可以优雅地处理锁定的文件(通过阻止,而不是失败 - 并且如果您自己的应用程序可以保证文件不会保持锁定状态,请阻止旧版应用程序进行扩展。)
更新2
如果有利于“检查遗留应用程序是否打开了该文件”(侵入性的方式容易出现竞争情况),则可以解决上述比赛通过以下条件:
- 检查遗留应用程序是否打开文件(a la
lsof
或ProcessExplorer
)
- 暂停遗留应用程序
- 重复步骤1中的检查以确认遗留应用程序未在步骤1和步骤2之间打开文件;如果是,请延迟并重新启动,否则请继续执行步骤4
- 在文件上完成您的业务 - 理想情况下只需将其重命名以用于后续独立处理,以便将遗留应用程序暂时保留最短时间
- 恢复遗留应用程序
你试图实现日志旋转? – vladr 2009-02-26 07:57:29
不完全,但不是太远。我想在现有的应用程序之上构建一个应用程序。 – 2009-02-26 08:41:38