如何测试进程是否正在使用目录中的文件

如何测试进程是否正在使用目录中的文件

我尝试在 IF 语句中使用 lsof 仅当其他程序未使用目录中的文件时才压缩目录。我可以在 shell 提示符下获取此信息

lsof +d /mydir/

如果它没有返回任何输出,我就知道该目录未被使用。如何将其格式化为条件语句,以便

if (lsof returns anything) then
  echo "$folder in use"
else
  tar $folder

谢谢

答案1

计算答案中的字符数,如下所示:

#!/bin/bash

a="$(lsof +d "${folder}")"

if [[ "${#a}" -gt 0 ]] then
    echo "${folder} in use"
else
    tar "${folder}"
fi

答案2

您可以尝试计算输出中的行数。我得到一个列名称标题行,然后为每个活动进程得到一个附加结果行,例如:

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    1002 debian  cwd    DIR  254,4     4096 393217 .
lsof    1592 debian  cwd    DIR  254,4     4096 393217 .
lsof    1593 debian  cwd    DIR  254,4     4096 393217 .

当我使用该wc -l命令来计算行数时,它也会计算尾随的换行符。这意味着wc -l当没有活动进程时应该计算 2 行输出。所以这样的事情应该有效:

if [[ $(lsof +d "${folder}" | wc -l) -gt 2 ]]; then
  echo "${folder} in use"
else
  tar "${folder}"
fi

看起来您可能还想使用lsof +D调用(大写“D”而不是小写“d”)来执行目录的递归、完全下降搜索。

相关内容