如何在不删除现有文件的情况下覆盖文件?

3
我有一个运行node_exporter的web服务器,它从一个目录中提供文件。这些文件包含特定时间点的主机指标。我有一个守护进程每15秒从其他出口商中抓取指标并写入此目录。当它写入文件时,我认为它会删除现有文件并写入新文件。因此,偶尔情况下,node_exporter在短暂的一瞬间不会从出口商提供任何指标。如何确保先前的指标存在,直到编写新的指标并且没有空/重复指标?

增加了重复描述,说明如何从节点和本机bash进行原子更新,因为问题没有包含明确的代码以消除歧义。 - Charles Duffy
那么在bash中没有办法解决这个问题吗?我在你添加的重复问题中没有看到解决方案。仅说明它不是原子性的。 - pdna
在单个文件系统中,重命名是原子性的。我相信这已经在重复内容中涵盖了 - 我会检查一下,如果没有,就添加更多内容。 - Charles Duffy
啊——Node.js的重复处理涵盖了创建并重命名模式,而Bash没有。添加了一个额外的Bash重复来覆盖这部分内容。 - Charles Duffy
与机制交互 -- foo > bar 在执行命令 foo 之前,使用 O_TRUNC 打开文件 bar,以便将 foo 的标准输出(FD 1)连接到该文件。 - Charles Duffy
1个回答

1
  1. write to a temporary file in the same directory
  2. when done, rename the temporary file to the result file

    mv tempfile outputfile
    

问题被标记为“bash”。如果从Node重命名,则Node应具有相同的目录和文件访问权限。如果Node也是Web服务器,这可能会略微不安全。 - anneb
所以移动命令是原子的,但重定向不是? - pdna
是的,看起来它是原子性的。谢谢! - pdna
1
重定向不是原子性的。mv命令“大多数情况下”是原子性的,请参阅关于stackoverflow上mv原子性的讨论。 - anneb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接