我有下面的程序通过cron运行并备份星号通话记录。
它在大多数情况下工作正常,但是如果当时正在进行呼叫,那么尝试复制它的行为似乎会将其杀死,即它从源和目的地都消失。
有没有办法阻止这种情况,即我可以在尝试复制文件之前以某种方式测试文件是否正在使用?
由于
from datetime import datetime
from glob import iglob
from os.path import basename, dirname, isdir
from os import makedirs
from sys import argv
from shutil import copyfile
def copy_asterisk_files_tree(src, fullpath=None):
DEST = datetime.now().strftime('/mnt/shardik/asteriskcalls/' + src)
if fullpath is None:
fullpath = src
if not isdir(DEST):
makedirs(DEST)
for path in iglob(src + '/*'):
if isdir(path):
copy_asterisk_files_tree(path, fullpath)
else:
subdir = '%s/%s' % (
DEST, dirname(path)[len(fullpath) + 1:]
)
if not isdir(subdir):
makedirs(subdir)
copyfile(path, '%s/%s' % (
subdir, basename(path).replace(':', '-')
))
if __name__ == '__main__':
if len(argv) != 2:
print 'You must specify the source path as the first argument!'
exit(1)
copy_asterisk_files_tree(argv[1])
答案 0 :(得分:1)
您需要做的就是使用锁。看看文档...
https://docs.python.org/2/library/fcntl.html#fcntl.flock
fcntl.flock(fd, op)
Perform the lock operation op on file descriptor fd (file objects
providing a fileno() method are accepted as well). See the Unix manual
flock(2) for details. (On some systems, this function is emulated
using fcntl().)
在之前的问题中也已对此进行了回答,例如:Locking a file in Python,使用filelock
(https://pypi.python.org/pypi/filelock/)。 Filelock是独立于平台的。
你也可以写一个临时文件并合并它们,但我更喜欢