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


8

我需要创建一个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

我不知道该! -z不该做[ test -n "$BUG" ]

我认为使用-n表示期望二进制。

我不知道该脚本是否还能工作,因为BUG锁定会中止每个进程,但是dmesg在计算机完全崩溃之前,仍然有几行内容-也许我可以追赶并杀死该进程。


2
您将整个dmesg都花了,所以一旦出现搜索字符串的一次,您就不会每次看到它,因此在每个循环中都将其杀死!(除了提及@ l0b0的其他事项,例如缺少睡眠/起搏等)
Olivier Dulac

Answers:


12

一些问题:

  • 您正在繁忙的循环中运行此程序,这将消耗尽可能多的资源。在这种情况下,sleep可以想象ing是合理的。
  • 但是,最新版本的dmesg会在输出之后添加一个标志,因此您可以将整个内容重写为(未测试)

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

1
您是否要添加-q以便grep -q 'searchstring从退出dmesg --follow并在看到搜索字符串出现一次后立即到达下一行?没有它,您的循环将不会到达killall或loop?
奥利维尔·杜拉克

1
即使使用-q,如果dmesg --follow显示了几行dmesg上下文(并因此显示了先前的出现),即使使用-q,我也担心会杀死很多人,因此我提出了aanswer作为变体。
奥利维尔·杜拉克

@OlivierDulac后面的问题应与一起处理tail
l0b0

怎么tail --lines=0办?我知道这对于其他任何值意味着什么。

1
@Joe在手册页中- --follow它仅跟随(即打印)命令启动后到达的行。
l0b0

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.,"
        }'

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

  • 它会一直工作到该过程终止。
  • killall每次出现搜索字符串“ BUG:工作队列锁定”时,调用次数也不会超过1 ,这会改善其他答案。

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

满意后,将其杀死,然后可以(而不是使用每次在shell中运行它nohup)将其转换为daemon script可以在当前运行级别中启动的。

即:使用另一个脚本作为模型(您至少需要有start,stop和status部分),您可以进行thescript适当的修改,然后将其放置在中/etc/rc.d/init.d,并Sxxthescript在相应的名称下指向它建立符号链接/etc/rc.d/rcNN即正常运行级别的编号(请参阅的顶行who -a以了解当前运行级别)。并且Kxxthescript在每个(或几乎每个)运行级别中也具有适当的符号链接,以便在切换运行级别时适当地杀死脚本。

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


@没人:我很高兴。不要忘记“接受”(绿色复选标记),无论哪个答案似乎都是您认为最好的,除非您认为需要保持开放以允许进一步的答案(或对当前答案进行修改)。
奥利维尔·杜拉克

这两个答案都是正确的,希望我能选择两者。
没人
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.