wes*_*099 6 grep logs timestamps temperature gawk
我在家里运行一个小型 linux 服务器,我正在编写一个脚本来每 5 秒记录一次 CPU 内核的温度,但我需要时间戳才能有用。到目前为止,我有一些东西可以将sensors命令的输出保存到一个文件中,并且我有一个打印日期和时间的命令。我只需要弄清楚如何将这两者结合起来。
sensors | grep ^Core* >> temps.log 以以下格式将临时文件保存在 temps.log 中:
Core 0: +39.0°C (high = +76.0°C, crit = +100.0°C)
Core 1: +40.0°C (high = +76.0°C, crit = +100.0°C)
Run Code Online (Sandbox Code Playgroud)
对于我可以做的date +%m/%d/%y-%H:%M:%S返回日期
mm/dd/yy-hh:mm:ss
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索,看到有人建议使用,gawk但我完全不知道如何gawk工作。
Jde*_*eBP 11
一个脚本 [...] 每 5 秒记录一次 [...] 我需要时间戳 [...] 一个循环 [...] 文件达到一定大小
您需要一个工具,将主程序的日志输出作为其输入,并将其写入一个有大小上限的日志文件,并添加时间戳。存在可以执行此操作以及更多操作的工具。他们所做的“更多”是日志文件的自动轮换,也可以按需触发,维护当前和旧日志文件的大小上限日志目录。
您可以选择以下工具:
multilog来自 daemontoolsmultilog来自 daemontools-encores6-log来自 s6svlogd来自 runittinylog来自 perpcyclog从小吃假设一个长时间运行的实用程序每隔几秒钟打印一次您想要的日志输出,例如:
#!/bin/sh
# 监控传感器
执行 2>&1
虽然是真的
做
传感器
睡 5
完成 | grep --line-buffered -- '^Core'
用法很简单:
monitor-sensors | cyclog ./tempsmonitor-sensors | multilog t ./temps并且可以轻松调整:
monitor-sensors | cyclog --max-file-size 32768 --max-total-size 1048576 ./tempsmonitor-sensors | s6-log t s32768 S1048576 ./tempsmonitor-sensors | multilog t s32768 n5 ./temps从这里开始,使用诸如 daemontools-encore/runit/perp/s6/nosh 之类的工具集,将这个管道的左右两侧移动到run程序中并将其作为实际守护程序的链接对运行,这只是一小步。
但是,如果您只想(比如说)从命令行执行一次性调用,它们也都可以处理为一次性输出到现有日志目录的问题。
其中一些工具可以做其他形式的时间戳,但它们都可以做 TAI64N 时间戳。TAI64N 时间戳被设计为能够达到纳秒精度,尽管前面提到的一些并没有完全实现这一点;旨在非常愉快地处理闰秒之类的事情,只要您的 TZ 数据库知道它们;并且是微不足道的sort,甚至是sort -m。
使用以下工具将 TAI64N 时间戳转换为您当前时区的本地时间(或者,假设它只是TZ环境变量,您选择的任意时区):
tai64nlocal来自 daemontoolstai64nlocal来自 daemontools-encoretai64nlocal从小吃观看这样的日志,因为它们是这样写的:
tail -F,尽管tail在非常快速的旋转时存在已知问题。(这是 . 的几个已知问题之一tail。其他已知问题包括处理日志文件的就地截断,这些日志文件很快就会出现更多日志数据。这个问题可能由诸如logrotate.等劣质系统触发。幸运的是,上述工具不会截断文件一旦完全写入并且不会冒此类额外tail问题的风险。)follow-log-directories来自 nosh,它“知道”这种日志目录并使用“光标”(永久维护在磁盘上)来可靠地跟踪日志目录中的位置以继续,即使在日志跟随者未查看时发生多次轮换.其他类型的处理可以使用工具完成,例如:
multilog-watchlograngemultilog-stamptailexport-to-rsyslog从小吃@JdeBP 已经回答了您可能应该做的事情。但这不是你提出的问题。因此,对于从 Google 来到这里并试图知道如何将内容附加/添加到多行输出的任何人,这里是:
首先,^Core*可能不会做你认为它会做的事情。它是一个正则表达式,用于匹配以“Cor”开头的行,后跟任意数量的“e”:“Cor”、“Core”、“Coreeeee”等。
其次,xargs是一个很好的工具,特别是对于单行和脏快速的脚本。您可能必须xargs对每一行输入进行操作,并使用参数为其中的每一行发出命令-I。所以你可以很容易地做这样的事情:
sensors | grep '^Core*' | xargs -I{} echo "${stamp}: {}" >> temps.log
Run Code Online (Sandbox Code Playgroud)
把'^Core*'withing引号,因为你不想意外(尽管可能性很小)shell扩展那里。的{}在-I告诉xargs替换{}与它将被执行命令的参数输入的每一行。当然,您可以选择其他模式;我只是喜欢模仿find -exec. 该${stamp}假定您在保存文件的日期/时间stamp。
您还可以引发一个子shell,在其中运行date命令(指定您想要的任何格式)并将xargs其标准输出用作参数的一部分echo:
sensors | grep '^Core*' | xargs -I{} echo "$(date): {}" >> temps.log
Run Code Online (Sandbox Code Playgroud)
同样,您可能应该做的是使用经过测试和维护的工具进行日志记录。但我在这里回答如何将时间戳附加/预先添加到 grep 输出,而不是如何正确制作日志。
如果我理解正确的话,您想要完成的是将当前日期添加到 grep 输出的每一行之前。对于 bash 脚本来说这是一个简单的任务:
sensors | grep ^Core |\
(
DATE=$(date +%m/%d/%y-%H:%M:%S)
while read LINE
do
echo "$DATE $LINE"
done
) >> temps.log
Run Code Online (Sandbox Code Playgroud)