我有一台需要监视的远程机器。它运行的是 Ubuntu Studio 22.04 (KDE Plasma)。几周前它崩溃了,journalctl 显示了崩溃前几分钟发生的“错误”。所以我编写了一个遵循journalctl的简单脚本,如果出现“Bug”一词,它会发送一封警告电子邮件。我大约 10 天前设置了该脚本运行。昨天,我远程连接到机器并检查htop,发现该脚本使用了90%以上的CPU。我杀了它,CPU 使用率恢复正常。这是脚本:
#!/bin/bash
#####################
# THIS SCRIPT LAUNCHED AT STARTUP, CHECKS journalctl for string "Bug"
######################
while true; do
nohup journalctl --follow | grep -i -q "bug" && mutt -s "ALERT - AirchainPC may be in TROUBLE" -- [email protected] < bug_issued_by_journalctl.txt &>/dev/null &
done
有什么可以解释 CPU 使用率高的原因吗?顺便说一句,我认为我不需要那个“nohup”。
请将您的脚本更改为:
在这里,您正在跟踪日志,尝试捕获包含“bug”字符串的行。如果字符串匹配,它将立即
grep
(感谢该--line-buffered
选项)返回到while
循环中。该read
命令将消耗每个这样的行并返回,以便while
此时执行语句的主体。我不知道文件的内容
bug_issued_by_journalctl.txt
是什么,但我更喜欢动态创建并包含与 的输出匹配的字符串(部分)的内容journalctl
。在这种情况下,请替换read -r
并使用邮件文本中变量read -r msg
的内容。$msg
此外,如果脚本由另一个用户和/或从另一个目录运行,则应使用上述文件的完整路径。由于命令
--follow
中的选项journalctl
,该脚本将永远不会返回。如果需要,您可以将脚本发送到后台,如下所示:一个简单的建议:在将某些内容放入后台之前,始终先进行交互测试!在测试时,您还需要将
&>/dev/null
最后一行中的 替换为&>/tmp/check_bug.out
.更新:正如@G.Sliepen建议的,您可以替换以下命令序列
和
不过,您应该阅读
man journalctl
页面,了解区分大小写和其他详细信息。