我正在尝试将 Linux bash 脚本移植到 FreeBSD。该脚本需要在决定是否采取某些操作之前检查文件是否打开(用于写入)。
在 Linux 上,这很容易使用以下fuser
命令:
if [[ ! `/usr/bin/fuser "$FILE"` ]]
then
...
fi
然而,在 FreeBSD 上,该fuser
命令似乎完全被破坏了(由this证明)并且没有返回任何正确的退出代码或任何有用的输出到标准输出。例如,在一个正在被主动写入的文件上:
# fuser file
file:
编辑:
弗拉基米尔·博特卡的评论:
“FreeBSD 12.0 中的简单测试显示”:
# tail -f /scratch/test-file`
# fuser /scratch/test-file
/scratch/test-file: 45042
# echo $?
0
# ps ax | grep 45042
45042 0 I+ 0:00.00 tail -f /scratch/test-file
45232 1 R+ 0:00.00 grep 45042
在我的 FreeBSD 机器(也是 FreeBSD 12)上,相同的测试产生以下结果:
# tail -f /scratch/test-file
# fuser /scratch/test-file
/scratch/test-file:
# echo $?
0
弗拉基米尔·博特卡的评论:
让我们尝试使用一个简单的 C 程序来测试对文件的写入,该程序打开文件,等待输入并将输入写入文件。
这是我对编译后的 C 代码的测试:
# ./a.out
Enter num:
# fuser /scratch/test-file
/scratch/test-file:
# echo $?
0
因此,fuser
似乎确实被打破了。但是,它似乎只在我的系统上坏了,而不是在 Vladimir Botka 的系统上,这很奇怪,因为它们都是 FreeBSD 12。
看来我可以使用lsof
或fstat
获取这些信息,但不能不对输出进行一些复杂的解析,这会使我的脚本更加复杂。我想知道是否有人可以向我指出一个简单的“是/否”命令来确定一个文件是否正在使用中,这样的文件是否fuser
可以在 FreeBSD 上运行?
非常感谢,