我有一个黑匣子系统,它定期更新单行“标志”文件。这个单行文件在系统的生命周期中采用各种不同的值,对应于 FSM 的状态。
例如,“下载”、“验证”、“发布”等。在任何给定时间点,该值都是不同的,因此软件必须打开“标志”文件,截断它,并写入新的单行值。
我如何维护连续不同值的日志?我考虑过类似的方法tail -f
,但能够记录不同的值,并保证在软件更新这些值时不会干扰文件系统。tail -f
一段时间后,简单的方法会失败,并显示“文件被截断”。
答案1
您可能想要tail -F
(注意它是大写的),如果失败,它将重试打开/读取文件。
从man tail
:
-f, --follow[={name|descriptor}]
output appended data as the file grows; -f, --follow,
and --follow=descriptor are equivalent
-F same as --follow=name --retry
--retry
keep trying to open a file even when it is or becomes
inaccessible; useful when following by name, i.e., with
--follow=name
如果您的版本tail
没有-F
(相当于tail -f=name --retry
),您可以使用inotify,然后等待close_write(inotifywait
是inotify 工具):
file=foo
while inotifywait -qq -e close_write "$foo" >/dev/null; do
cat "$foo"
done > log
tail -F
如果可用的话应该是首选,因为使用时存在竞争条件inotifywait
。