如何判断 GZip 文件在复制时是否仍在写入

如何判断 GZip 文件在复制时是否仍在写入

我在路径中获取了一个 gzip 文件。

输入文件夹路径:

<server>/input_gate

我想检查我在此文件夹中获取的 GZIP 文件是否有效?我使用了以下命令。它可以很好地查找 gzip 文件是否有效?

gzip -t -v <file_name>

但是当移动发生时,文件显示为无效文件。但实际上一旦移动完成,文件就是有效的。有没有办法找出我得到的文件是完全移动的文件还是移动仍在进行中?

答案1

按照这个答案“询问 Ubuntu”您可以使用lsof(列出打开的文件)检查文件是否打开:

lsof | grep <server>/input_gate

答案2

使用lsof

要测试某个进程是否打开了文件,请path/to/input_gate运行以下命令:

lsof path/to/input_gate

如果有进程正在使用该文件,则退出代码为 0;如果没有进程正在使用该文件(或发生错误),则退出代码为 1。此退出代码可供 shell 命令使用。

测试

为了测试这一点,让我们创建一个打开文件的过程:

sleep 10 >>path/to/input_gate &

这将使文件保持打开状态 10 秒。要测试lsof,请快速运行以下命令:

$ if lsof path/to/input_gate >/dev/null; then echo "In use"; else echo "Not in use"; fi
In use

等待 10 秒然后重试:

$ if lsof path/to/input_gate >/dev/null; then echo "In use"; else echo "Not in use"; fi
Not in use

等待文件准备好

如果您想等到没有其他进程使用该文件:

while lsof path/to/input_gate >/dev/null; do sleep 1; done; echo "Finally, not in use"

使用inotifywait

如果您的系统支持inotifywait(Linux 系统应该支持),那么就可以查找感兴趣的文件的关闭事件:

inotifywait  "path/to/input_gate" -e close

上述命令将会阻塞直到某个进程关闭该文件。

这种方法的优点是它消除了轮询。

这种方法的缺点是,它会在某个进程第一次关闭文件时通知你,这可能与全部已关闭文件的进程。

相关内容