监视未附加的文件中的更改

时间:2013-06-18 18:02:16

标签: shell

我想编写一个监视文件更改的shell脚本。也就是说,我写的另一个程序根据其状态将1或0写入文件。我想创建一个无限运行的脚本,并监视该文件的状态。到目前为止,我已经通过使用tail -f在线找到了一个紧密的解决方案。但是,此命令需要不断追加文件。当我运行以下代码时,我得到tail: test.log: file truncated。此外,当我通过在另一个终端上来回运行echo 1 > test.logecho 0 > test.log来测试此程序时,似乎它会定期完全错过文件中的更改。可能与尾部期望跟随文件有关,因为它被附加而不是仅仅更改单个字符(因此认为文件已被截断,我想)。

这是我尝试过的代码:

#!/bin/sh
# Monitor changes in file

tail -fn0 test.log | \ 
    while read line; do
        if [ $line = 1 ]; then
            echo "TRUE!!!"
        elif [ $line = 0 ]; then
            echo "FALSE!!!"
        fi
done

解决方案可能非常容易,但我无法设法找到它。

1 个答案:

答案 0 :(得分:2)

如果要定期捕获文件的状态,可以执行以下操作:

INTERVAL=2
while sleep 2; do
    val="$(cat "test.log")"
    case "$val" in
        ...
    esac
done

或者,如果您只想在文件更改时对文件内容执行操作,则需要使用“修改时间”。例如,

mtime () {
    ls "$1" -l --time-style=+%s | cut -d' ' -f6
}

FILE="test.log"
LAST_TIME=$(mtime "$FILE")
touch "$FILE" #Force first update

while sleep 2; do
    if [[ $(mtime "$FILE") -gt $LAST_TIME ]]; then
        LAST_TIME=$(mtime "$FILE")
        val="$(cat "$FILE")"
        ...
    fi
done

如果2秒的延迟太大,请使用较小的数字。或者,使用true代替sleep,几乎为零延迟。