这个简单的脚本消耗了大量的 CPU,为什么?

这个简单的脚本消耗了大量的 CPU,为什么?

我有一台需要密切关注的远程机器。它运行的是 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 -rread -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页面虽然区分大小写以及其他详细信息。

相关内容