我有一台需要密切关注的远程机器。它运行的是 Ubuntu Studio 22.04(KDE Plasma)。几周前它崩溃了,journalctl 显示了一个在崩溃前几分钟发生的“Bug”。因此,我编写了一个跟在 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”。
答案1
请将您的脚本更改为类似以下内容:
#!/bin/bash
journalctl --follow | grep --line-buffered -i bug | while read -r ; do
mutt -s "ALERT - AirchainPC may be in TROUBLE" -- '[email protected]' < bug_issued_by_journalctl.txt
done
在这里,您正在跟踪日志,试图捕获包含“bug”字符串的行。如果字符串匹配,它将返回grep
立即地(感谢--line-buffered
选项)进入while
循环。该read
命令将使用每个这样的行并返回,以便语句的主体while
将在此时执行。
我不知道bug_issued_by_journalctl.txt
文件的内容是什么,但我更喜欢动态创建并包含(部分)与 的输出匹配的字符串journalctl
。在这种情况下,替换read -r
并read -r msg
使用邮件文本中的变量内容$msg
。此外,如果脚本要由另一个用户和/或从另一个目录运行,则应使用上述文件的完整路径。
由于命令--follow
中的选项journalctl
,此脚本永远不会返回。如果您愿意,可以像这样将脚本发送到后台:
#!/bin/bash
check_bug () {
journalctl --follow | grep --line-buffered -i bug | while read -r ; do
mutt -s "ALERT - AirchainPC may be in TROUBLE" -- '[email protected]'
done
}
check_bug &>/dev/null &
一个简单的建议:在将某些东西放入后台之前,请务必先进行交互测试!在测试时,您还需要将&>/dev/null
最后一行中的替换为类似以下内容&>/tmp/check_bug.out
。
更新:正如@G.Sliepen 所建议的,您可以替换命令序列
journalctl --follow | grep --line-buffered -i bug
和
journalctl --follow --grep=bug
你应该读man journalctl
页面虽然区分大小写以及其他详细信息。