2

我想运行服务来监听文件修改,并为每个添加到文件的文件从文件中删除它并附加到另一个文件我尝试了这段代码,但它不像进入无限循环那样工作

   inotifywait -m -e modify "$1" |
    while read folder eventlist eventfile
    do
        cat "$1">>$DESTINATION_FILE
        >$1
    done 
4

2 回答 2

2

每次截断文件时,都会注册为修改,这会触发另一个截断等。尝试测试文件是否包含循环体中的任何内容。

inotifywait -m -e modify "$1" |
while read folder eventlist eventfile
do
    # Only copy-and-clear if the file is not empty
    if [ -s "$1" ]; then
        cat "$1" >> "$DESTINATION_FILE"
        # What if the file is modified here?
        >$1
    fi
done

请参阅我的评论cat和截断。您永远不会将这些修改放入 中$DESTINATION_FILE,因为您会在循环的下一次迭代之前删除它们。这并不是真正可以避免的,除非您的操作系统允许您在$1之前获得锁定cat,然后在截断之后释放锁定,以便一次只有一个进程可以写入文件。

于 2013-11-12T13:35:11.007 回答
2

正如 chepner 所指出的,还原更改也将被视为文件修改。

一个出路是:

  1. 去掉 -m 参数
  2. 在 bash 中手动实现 while 循环

例如

cp "$1" "$1.bak"
while true; do inotifywait -e modify "$1" | {
    read folder eventlist eventfile;
    cat "$1" >> "$DESTINATION_FILE";
    # OR
    # diff  "$1" "$1.bak"  >> "$DESTINATION_FILE";
    cp "$1.bak" "$1";
    }
done

注意:我自己没有测试过上面的代码。

注意2:可能存在原子性问题。有时不会监视文件修改。因此,当此cat >操作或cp操作正在进行时,有人可能会尝试写入"$1"文件,这将被遗漏。

于 2013-11-12T14:36:35.933 回答