我想运行服务来监听文件修改和每个添加到文件从文件中删除它并附加到另一个文件 我尝试了这段代码,但它无法像进入无限循环那样工作
inotifywait -m -e modify "$1" |
while read folder eventlist eventfile
do
cat "$1">>$DESTINATION_FILE
>$1
done
答案 0 :(得分: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
上的锁定,然后在截断后释放锁定,以便只有一个进程可以写入文件一次。
答案 1 :(得分:2)
正如chepner所指出的,恢复还原也将被视为文件修改。
出路是:
e.g。
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"
文件,这将被遗漏。