0

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

这是我尝试过的代码:

#!/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

解决方案可能非常简单,但我无法找到它。

4

1 回答 1

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, 几乎为零延迟。

于 2013-06-18T18:08:58.713 回答