7

我正在尝试测试单个文件是否使用 lsof 打开。有比这更快的方法吗?

$result = exec('lsof | grep filename | wc -l');

if($result > 0) {
    //file is open
}

如果您知道文件名,我认为它们必须是一种仅测试一个文件的方法。我真正需要的只是一个真或假。

4

4 回答 4

13

我找到了一个更好的方法。使用 lsof(在 4.63 版本上测试),您可以直接查询特定文件:

if lsof filename > /dev/null; then
    # file is open
fi
于 2010-03-26T22:07:59.927 回答
3

好吧,您可以跳过wc并使用 grep 的返回值(如果检测到模式,grep 返回 0(即成功),如果未检测到模式,则返回 1(即不成功)):

if lsof | grep filename > /dev/null; then
    # filename is in output of lsof
fi

-l您可以通过使用 grep 的标志来改进这一点:

if lsof | grep -l filename > /dev/null; then
...

这告诉 grep 一旦检测到第一个匹配项就停止查找。

于 2010-03-26T22:00:45.593 回答
2

不。当您尝试对结果做任何事情时,答案可能会改变。相反,请尝试对文件执行您打算执行的任何操作并处理“正在使用”错误或“共享冲突”。

于 2010-03-27T03:28:17.927 回答
1

使用fuser. 如果指定的任何文件正在使用,则返回非零值,如果它们全部可用,则返回零。

于 2010-03-27T01:56:20.627 回答