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 [。@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/rcN,N作为正常运行级别的编号(请参阅顶部的行who -a以了解当前运行级别)。并且Kxxthescript在每个(或几乎每个)运行级别中都有适当的符号链接,以便在切换运行级别时适当地终止脚本。
或者做“适当的事情”以通过 systemd 或您的发行版使用的任何等效系统运行/停止它。
| 归档时间: |
|
| 查看次数: |
1417 次 |
| 最近记录: |