我有一个关于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. error : file在我们读取时更改“。
我假设这是因为有一些缓存的磁盘写入来自第一个进程,并且文件实际上是在第一个进程实际终止并且不再在内存中被写入磁盘之后完成的。
所以,我的问题是:在实际读取此文件之前,是否有一种优雅的方法等待缓存的磁盘写入完成?我认为有一件事是读取磁盘上文件的大小,等待几秒钟,然后再检查文件的大小,如果它们是相同的,那么假设它们正在编写,但我认为必须有一个更优雅的方法来解决这个问题。有谁能在这方面提出建议?谢谢你抽出时间回答我的问题。
发布于 2014-08-05 19:01:25
调用p.wait() (或另一个间接等待退出的调用,如communicate()),然后调用p2。
只调用p.stderr.read(),等待p关闭其stderr通道;但是,程序可以在关闭其余的文件描述符之前关闭stderr (对于每个单独的文件句柄,触发刷新到VFS层的步骤)并退出。
如果您的文件系统是Linux上的NFS,请确保正在使用sync标志(与w/默认async相反),以便在本地端继续运行之前在远程端完成操作。
发布于 2014-08-05 17:01:36
尝试使用文件阻塞标志。一旦关闭第一个进程释放标志文件,这将是第一个进程的工作已经完成的标志。
https://stackoverflow.com/questions/25144336
复制相似问题