在执行之前Bash检查文件写入完成

时间:2016-05-26 13:13:53

标签: linux bash

我正在运行Tcpdump每60秒生成一个新文件。同时我正在运行一个bash脚本来处理由Tcpdump生成的文件,但在执行之前我应检查文件写入完成情况。 我正在使用“fuser”但我发现它总是返回1(旧文件和新文件仍由tcpdump写入)。任何人都可以告诉我如何解决它

#!/bin/bash

FULLPATH=$1
echo $FULLPATH

for file in $FULLPATH/*.pcap
   do
       echo "file name: $file"

       fuser $file
       result=$?
       echo $result

       if [ $result = 0 ]; then
           echo "There are no processes accessing file: $file"    
           sudo /usr/src/nDPI/example/ndpiReader -i $file
           echo "end: $file" 
           #rm-f $file

       else

          echo "file $file is in use." 
       fi

   done 

1 个答案:

答案 0 :(得分:1)

咨询fuser手册显示

  如果没有访问任何指定文件或发生致命错误,

fuser返回非零返回码

因此获得非零代码可能不错,但您可能也想检查输出,以区分致命错误与正在使用的文件:

ouput=$(fuser $file)
return_code=$?

if [ "$return_code" -ne 0 ]; then
  if [ -n "$output"]; then
    echo "The file is being used"
  else
    echo "A fatal error occured !"
  fi
else
  echo "The file is not being used"
fi

如果您不关心致命错误(毕竟,如果发生了错误,您可能不应该尝试读取文件),那么检查返回代码是否为零应该就足够了。

总结并改写一下,fuser将:

  • 如果其他进程正在访问该文件,则返回0,并输出这些
  • 的列表 如果没有访问该文件,或者发生致命错误,则
  • 返回其他内容
    • 如果没有访问该文件,代码可能会为1,但是没有记录
    • 如果发生致命错误,代码可能不是0或1,但是没有记录