Popen 磁盘写入缓存
我有一个关于Python和磁盘写入的新手问题。基本上,我在顺序执行一些popen进程,其中第二个进程将第一个进程的输出作为输入文件。例如:
p = subprocess.Popen(["mysqldump", "--single-transaction", "-u",
database_username, "--password="+database_password, "--databases",
"--host", server_address, database_name, ],
stdout = open( outputfile, 'w') , stderr=subprocess.PIPE)
error = p.stderr.read()
然后
p2 = subprocess.Popen(["tar", "-C", backup_destination,
"--remove-files", "--force-local", "-czf", gzipoutputfile,
mysqlfilename ], stderr=subprocess.PIPE)
error2 = p2.stderr.read()
这个过程通常顺利完成,没有任何问题。需要注意的是,第二个进程是从第一个进程生成的文件中读取数据。偶尔,我会在第二个子进程中遇到一个错误,提示“tar: host-ucpsom_2012-2014-08-05-0513.mysql: 文件在读取时发生了变化”。
我猜这可能是因为第一个进程的一些磁盘写入还在缓存中,实际上文件是在第一个进程结束后才完成写入到磁盘的。
所以,我的问题是:有没有什么优雅的方法可以在实际读取这个文件之前,等待缓存的磁盘写入完成?我想到的一种方法是先读取磁盘上文件的大小,等几秒钟,然后再检查文件的大小,如果它们是一样的,就可以假设写入完成了,但我觉得应该有更好的方法来解决这个问题。有没有人能在这方面给我一些建议?非常感谢你们花时间回答我的问题。
2 个回答
0
试着使用一个文件锁定标志。先关闭第一个进程,这样就能释放标志文件,这样就可以表示第一个进程的工作已经完成。
2
在调用 p2
之前,先执行 p.wait()
(或者其他会间接等待程序结束的调用,比如 communicate()
)。
如果你只调用 p.stderr.read()
,这只是让 p
等待它的错误输出通道关闭;但是,一个程序可以在关闭其他文件通道之前就先关闭它的错误输出通道(对于每个单独的文件句柄,这个步骤会触发数据刷新到虚拟文件系统层),然后再退出。
如果你的文件系统是 Linux 上的 NFS,确保使用了 sync
标志(与默认的 async
相对),这样在本地继续操作之前,远程的操作就已经完成了。