bash脚本,用于在移动或删除文件时使"tail-f"退出



当前删除、移动或重命名运行有tail -f的文件没有任何作用,我希望它中止。我读过手册页,似乎-f应该在文件移动时中止,-f会跟随文件,但在Mac OS X上,-f和-f似乎是一样的。如何编写一个bash脚本,使tail-f在文件移动后干净地退出?

  • Linux上,您可以使用tail --follow=name(而不仅仅是-f,相当于--follow=descriptor)来实现您想要的功能,但前提是文件已被删除而不是移动-一旦文件被删除,将报告一条错误消息,tail将退出(代码为1);遗憾的是,相比之下,如果只是移动(重命名)文件,tail就不会退出,这就需要一个编程解决方案
  • OSX上,无论是移动还是删除文件,都需要编程解决方案

bash脚本用于在目标文件(以其原始名称)不复存在时退出拖尾-来自@schellsan自己的答案的更健壮的脚本公式:

#!/usr/bin/env bash
tail -f "$1" &  # start tailing in the background
while [[ -f $1 ]]; do sleep 0.1; done # periodically check if target still exists
kill $! 2>/dev/null || : # kill tailing process, ignoring errors if already dead
  • 正确处理需要引用的文件名(例如,带有空格的名称)
  • 防止在文件存在性检查之间睡眠,从而造成紧密循环-根据需要调整睡眠持续时间;注意:有些平台只支持积分

如果需要更强的鲁棒性,这里有一个版本:

  • 通过退出陷阱杀死后台进程,以确保它被杀死,而不管脚本本身是如何退出的(通常,或者,通过Control-C)
  • 如果发现后台进程不再活动,则退出脚本
#!/usr/bin/env bash
# Set an exit trap to ensure that the tailing process
# - to be created below - is terminated, 
# no matter how this script exits.
trap '[[ -n $tailPid ]] && kill $tailPid 2>/dev/null' EXIT
# Start the tailing process in the background and
# record its PID.
tail -f "$1" & tailPid=$!
# Stay alive as long as the target file exists.
while [[ -f $1 ]]; do
# Sleep a little.
sleep 0.1
# Exit if the tailing process died unexpectedly.
kill -0 $tailPid 2>/dev/null || { tailPid=; exit; }
done

为了防止其他人遇到这个问题,您可以使用一个小脚本,在该脚本中,您将tail作为后台进程运行,然后循环直到文件被移动,从而终止tail进程。

#!/bin/bash
tail -f $1 &
pid=$!
while [ -f $1 ]
do
if [ ! -f $1 ]
then
kill -9 $pid
fi
done

相关内容

  • 没有找到相关文章

最新更新