我想编写一个监视文件更改的shell脚本。也就是说,我写的另一个程序根据其状态将1或0写入文件。我想创建一个无限运行的脚本,并监视该文件的状态。到目前为止,我已经通过使用tail -f在线找到了一个紧密的解决方案。但是,此命令需要不断追加文件。当我运行以下代码时,我得到tail: test.log: file truncated
。此外,当我通过在另一个终端上来回运行echo 1 > test.log
和echo 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
解决方案可能非常容易,但我无法设法找到它。
答案 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
,几乎为零延迟。