gpt4 book ai didi

linux - 在读取时使用 tail -f 监视文件并执行命令?

转载 作者:IT王子 更新时间:2023-10-29 00:49:47 28 4
gpt4 key购买 nike

我正在尝试观察文件并在每次文件更改时执行命令一次,理想情况下只使用 native bash 命令。

这是我所能得到的,但是我如何检查我是否到达了文件的开头或结尾?我意识到 tail -f 没有读取 EOF 那么我怎么知道我已经到达文件末尾了?

 tail -f source_file.js | while read line || [[ -n "$line" ]]; 
# how do I execute a command here just **once**?
done

不使用 tailwhile read 的答案将被接受,只要它们是 native bash 命令并且大约一行。

也许每次调用 while 时我都可以将一个变量归零?

最佳答案

来自男人:

-f

The -f option causes tail to not stop when end of file is reached, but rather to wait for additional data to be appended to the input.

所以,如果要监控和做 Action ,需要把脚本分成两个进程

  • 一个将显示内容tail(如果你想亲自监控变化)
  • 其次将监控变化并采取行动

  • 您应该使用例如 perlpython 什么可以监视文件结尾并在到达时执行一些操作(例如,运行 bash 脚本)。

bash 灵魂可以基于文件修改时间

file="./file"

runcmd() {
echo "======== file $1 is changed ============"
}

#tail -f "$file" & #uncomment 3 lines is you want pesonally watch the file
#tailpid=$!
#trap "kill $tailpid;exit" 0 2 #kill the tail, when CTRL-C this script

lastmtime=0
while read -r mtime < <(stat -c '%Z' "$file")
do
if [[ $lastmtime != $mtime ]]
then
lastmtime=$mtime
runcmd "$file"
fi
sleep 1
done

添加了另一个基于标准 perl 的解决方案

perltail() {
#adapted from the perlfaq5
#http://perldoc.perl.org/perlfaq5.html#How-do-I-do-a-tail--f-in-perl%3f
perl -MTime::HiRes=usleep -Mstrict -Mautodie -e '
$|=1;
open my $fh, "<", "$ARGV[0]";
my $curpos;
my $eof=1;
for (;;) {
for( $curpos = tell($fh); <$fh>; $curpos =tell($fh) ) {
print;
$eof=1
}
print "=EOF-reached=\n" if $eof;
$eof=0;
usleep(1000); #adjust the microseconds
seek($fh, $curpos, 0);
}' "$1"
}

eof_action() {
echo "EOF ACTION"
printf "%s\n" "${newlines[@]}" #new lines received from the last eof
newlines=() #empty the newlines array
}

perltail "./file" | while read -r line
do
if [[ $line =~ =EOF-reached= ]]
then
eof_action
continue
fi
#do something with the received lines - if need
#for example, store new lines into variable for processing in the do_action and like
newlines+=($line)
done

原则:

  • perltail bash 函数运行 tail -f 的 perl 实现,此外,当到达文件末尾时,它会打印一个 MARK 到输出,这里:=EOF-reached=
  • bash while read 查找 MARK 并仅在标记存在时运行操作 - 例如仅当到达文件末尾时。

关于linux - 在读取时使用 tail -f 监视文件并执行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25712655/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com