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

tha*_*ott 7 performance scripts cpu

我有一台需要监视的远程机器。它运行的是 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" -- myemail@gmail.com < bug_issued_by_journalctl.txt &>/dev/null &

done
Run Code Online (Sandbox Code Playgroud)

有什么可以解释 CPU 使用率高的原因吗?顺便说一句,我认为我不需要那个“nohup”。

Fed*_*eli 15

请将您的脚本更改为:

#!/bin/bash
journalctl --follow | grep --line-buffered -i bug | while read -r ; do
  mutt -s "ALERT - AirchainPC may be in TROUBLE" -- 'myemail@gmail.com' < bug_issued_by_journalctl.txt
done
Run Code Online (Sandbox Code Playgroud)

在这里,您正在跟踪日志,尝试捕获包含“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" -- 'myemail@gmail.com'
  done
}

check_bug &>/dev/null &
Run Code Online (Sandbox Code Playgroud)

一个简单的建议:在将某些内容放入后台之前,始终先进行交互测试!在测试时,您还需要将&>/dev/null最后一行中的 替换为&>/tmp/check_bug.out.


更新:正如@G.Sliepen建议的,您可以替换以下命令序列

journalctl --follow | grep --line-buffered -i bug
Run Code Online (Sandbox Code Playgroud)

journalctl --follow --grep=bug
Run Code Online (Sandbox Code Playgroud)

不过,您应该阅读man journalctl页面,了解区分大小写和其他详细信息。

  • 可能值得一提的是,行缓冲选项不是 POSIX(无论如何,我不确定为什么需要它:与缓冲输出有关?)。 (2认同)