linux - 仅当文件未被其他进程使用时才在 Linux 中移动文件

标签 linux file atomic lsof

使用 lsof 命令,我可以确定某个文件是否正在被某个进程使用,但我需要自动检查文件是否正在使用,只有在未使用时才移动它。这些文件正被我无法控制的各种其他程序使用,因此我无法使用建议锁。目的是阻止其他进程修改该文件,因此仅在进程打开文件时移动文件是不行的。有什么解决办法吗?

更新:我刚刚想到一个我认为适合我的目的的解决方案。最终目标是在其他程序完成修改这些文件时,以它们的最终状态处理这些文件。如果我将文件移动到另一个目录,然后我可以使用 lsof 检查它是否仍在通过其旧路径使用;如果是这样,我只是稍后再检查,直到它不再被使用,然后处理该文件。通过将文件移动到另一个目录,它向用户和程序隐藏了该文件。我不希望用户和程序看到旧目录中的文件,因为这让他们有机会在我使用 lsof 和处理文件之间打开文件,这意味着我将在修改后的状态下处理文件。

最佳答案

使用 fuser 怎么样?在文件上运行它,它将显示使用该文件的进程的 PID。如果没有 PID,则没有任何东西使用该文件。如果没有进程使用该文件,它还将返回一个非零退出代码。

但是,请注意,您仍然可能会遇到竞争条件,因为进程可能会在 fuser 命令返回之后和您 mv 它之前打开文件。

一些在不使用时移动文件的示例代码:

if ! fuser /my/file
then
     mv /my/file /somewhere/else
fi 

关于linux - 仅当文件未被其他进程使用时才在 Linux 中移动文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8746784/

相关文章:

c# - 将字符串转换为 HttpPostedFileBase

c++ - 获取释放内存顺序与顺序一致性不同的实际例子是什么?

linux - $ 在 Linux 中是什么意思?

linux - 从脚本更改 root 密码

java - 从文件列表中删除文件

python - 如何在 Python 中写入多个文件?

c++ - 实际上,C++11 中 std::atomic 的内存占用是多少?

linux-kernel - 如何正确唤醒中断处理程序内的进程

linux - 在 linux 中合并两个文件并忽略任何重复

c++ - 并行执行比串行执行花费更多时间?