如果在 dmesg 中发现某些内容,如何创建一个无限循环来终止进程?

Nob*_*ody 8 linux scripting bash

我需要创建一个while循环,如果dmesg返回一些/任何值,那么它应该终止一个确定的进程。

这是我所拥有的。

#!/bin/bash
while [ 1 ];
do

BUG=$(dmesg | grep "BUG: workqueue lockup" &> /dev/null)

    if [ ! -z "$BUG" ]; then
   killall someprocessname

else
    break
    fi
    done
Run Code Online (Sandbox Code Playgroud)

我不知道! -z我是否应该这样做[ test -n "$BUG" ]

我认为 -n 它说明了期望二进制文件。

我不知道脚本是否会工作,因为 BUG 锁定会暂停每个进程,但是dmesg在计算机完全停止之前仍然有更多的行- 也许我可以赶上并终止进程。

l0b*_*0b0 12

一些问题:

  • 您正在一个繁忙的循环中运行它,这将消耗尽可能多的资源。这是sleeping 可以被证明是合理的一个例子。
  • 但是,最近版本dmesg的输出有一个标志,因此您可以将整个内容重写为(未经测试)

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
    
    Run Code Online (Sandbox Code Playgroud)
  • 代码应该缩进以便于阅读。
  • 这是很奇怪的,但是[是一样的test-见help [


Oli*_*lac 9

@l0b0 答案的变体:

dmesg --follow | awk '
   /BUG: workqueue lockup/  { system ("killall someprocessname") ; rem="done at each occurrence. You could add further things, like print to a logfile, etc.,"
        }'
Run Code Online (Sandbox Code Playgroud)

这让我们 awk 进行循环,它有一些优点:

  • 它会一直工作,直到该过程终止。
  • 它也不会在killall每次出现搜索字符串“BUG:workqueue lockup”时调用超过 1个,这改进了另一个答案。

测试:您可以将其放入名为 的脚本中thescript,然后执行nohup thescript &,这样thescript即使在您退出会话后仍会继续运行。

一旦你对它的工作感到满意,杀死它,然后你可以(而不是每次在 shell 中运行它nohup)将它转换为daemon script你可以在当前运行级别启动的。

即:使用另一个脚本作为模型(您至少需要有开始、停止和状态部分),您可以thescript适当修改,然后将其放置在 中/etc/rc.d/init.d,并Sxxthescript在适当的(s)下命名为它的符号链接/etc/rc.d/rcNN作为正常运行级别的编号(请参阅顶部的行who -a以了解当前运行级别)。并且Kxxthescript在每个(或几乎每个)运行级别中都有适当的符号链接,以便在切换运行级别时适当地终止脚本。

或者做“适当的事情”以通过 systemd 或您的发行版使用的任何等效系统运行/停止它。