我有一个以 NAND 闪存作为 rootfs 的嵌入式设备。日志文件保存在 RAM 中,因为它们通常很无聊,并且不能磨损闪存。但很少有设备会进入需要调试的缺陷状态。因此,出现错误时,我将/var/log/messages
shell 脚本(busybox bash)复制到 NAND。
到目前为止,一切都很好。不幸的是,如果出现一个错误,在看门狗重新启动系统之前可能会产生数百甚至数千次崩溃。我喜欢尽可能接近崩溃地调查日志文件,但我不想将整个日志文件复制数千次,而是复制一次,然后将所有新消息附加到该文件。
你会怎么做?我可以考虑存储一个行计数器,如果文件已经存在,则仅在行计数器之后附加行(然后更新行计数器),但也许有更智能的方法来做到这一点?
答案1
在复制文件的同一错误处理代码中,您是否不能启动一个后台进程来tail -f
将后续行附加到复制的日志文件中?就像是:
tail -c +$(( $(wc -c COPIED_LOG | awk '{print $1}')+1 )) -f /var/log/messages >> COPIED_LOG
whereCOPIED_LOG
是存储复制的日志文件的路径。tail
指示从 中遇到的第 -th 个字节-c +N
开始输出,为此,我在这里使用复制文件中已有的字节数 ( ) 加一来获取新内容开始的字节。然后将其附加到using 。N
/var/log/messages
wc -c COPIED_LOG | awk '{print $1}'
COPIED_LOG
>>
您必须将其包装起来nohup ... &
或类似的东西才能使其作为后台进程运行。另外,正如您在问题中已经说过的那样,检查是否COPIED_LOG
已经存在,如果不存在,则仅运行此后台进程。