【问题标题】:Should my script use cp or mv to be more robust?我的脚本应该使用 cp 或 mv 来更健壮吗?
【发布时间】:2012-06-27 16:45:34
【问题描述】:

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

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

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

为了安全起见(断电或任何意外情况)。最好的选择是什么: cp 或 mv ? 谢谢。

【问题讨论】:

  • 通过“覆盖file.dat”,您的意思是文件被截断为零,然后再次填充?
  • yes larsman.....(添加点以符合 mimimun 字符长度)

标签: linux bash error-handling fault robustness


【解决方案1】:

我会使用一个组合:

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

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

【讨论】:

    【解决方案2】:

    错误问题的正确答案

    如果你想要一个快速的原子动作,那么 mv 就是你要做的事情,因为man 2 rename 说:

    如果 newpath 已经存在,它将被自动替换(取决于一些条件;请参阅下面的错误),因此尝试访问 newpath 的另一个进程不会发现它丢失。

    或许更重要的是,mv很大程度上是一种目录输入操作,因此在任何正常情况下,它都比文件复制快得多。

    正确问题的正确答案

    如果您担心断电或系统意外关闭,那么:

    1. 连接不间断电源。真的。求解威胁模型。
    2. 确保您使用的是电池供电的 RAID 控制器。
    3. 使关键写入同步。
    4. 使用日志文件系统来记录数据,而不仅仅是元数据。

    mv 命令应该更快,但面对灾难性故障时的稳健性是硬件或文件系统问题。

    【讨论】:

      【解决方案3】:

      在这里可能没有太大帮助,但rsync 是这种工作的工具。如果传输被中断,它可以从它需要去的地方重新开始。

      【讨论】:

        猜你喜欢
        • 2019-10-25
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多