我的脚本应该使用cp还是mv更健壮?

时间:2012-06-27 16:45:34

标签: linux bash error-handling fault robustness

我有一个bash脚本(Scientific Linux)。 该脚本必须对文件进行操作。我们说“file.dat”(大约1 GB) 一段时间后,脚本重新启动并执行以下操作:

if [ -f file.dat ];  then
    cp file.dat file.previous.dat
fi

备份文件。 然后一个进程启动并覆盖“file.dat”

为了最安全的一面(电力关闭或任何意外)。什么是最好的选择:cp还是mv? 感谢。

3 个答案:

答案 0 :(得分:5)

我会使用一个组合:

mv file.dat file.dat.previous
cp file.dat.previous file.dat

这样file.dat.previous将永远完整,因为mv是原子的。

答案 1 :(得分:4)

错误问题的正确答案

如果你想要一个快速的原子移动,那么 mv man 2 rename所说的事情:

  

如果newpath已经存在,它将被原子替换(受一些条件限制;请参阅下面的错误),这样就没有其他进程尝试访问newpath就会发现它丢失了。

也许更重要的是, mv 主要是目录条目操作,因此与任何正常情况下的文件副本相比,它都非常快。

正确答案的正确答案

如果您担心停电或系统意外停机,那么:

  1. 连接不间断电源。真。解决威胁模型。
  2. 确保使用的是电池供电的RAID控制器。
  3. 使关键写入同步。
  4. 使用记录数据的日记文件系统,而不仅仅是元数据。
  5. mv 命令应该更快,但面对灾难性故障时的稳健性是硬件或文件系统问题。

答案 2 :(得分:1)

这里可能没有太大帮助,但rsync是这类工作的工具。如果传输中断,它可以从需要的地方重新启动。