2

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

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

4

2 回答 2

5

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

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

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

if ! fuser /my/file
then
     mv /my/file /somewhere/else
fi 
于 2012-01-05T17:30:17.947 回答
2

您可以移动一个正在访问它的文件,假设您使用rename(2)系统调用将它移动到同一个文件系统上(mv如果源和目标在同一个文件系统上,它将使用)。您甚至可以使用unlink(2)系统调用来删除它。并且移动这样的文件确实会禁止其他未来的进程通过相同的路径访问它。

您还可以使用inotify(7) API 在访问它时收到通知。

您也可以考虑至少对某些文件系统进行强制锁定。

但有传言说强制锁定效果不佳,有时可能会出错

于 2012-01-05T17:37:57.577 回答