一部/何らかの値が返される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
たぶんプロセスを追いかけて終了することができます。
答え1
いくつかの問題:
- できるだけ多くのリソースを消費する忙しいループで実行しています。これは
sleep
ingが合理的であると想像できる例です。 しかし、最新バージョンには
dmesg
出力に続くフラグがあります。だから、全体の内容を(テストされていない)として書き換えることができます。while true do dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup' killall someprocessname done
- コードを読みやすいようにインデントする必要があります。
- これは本当に奇妙ですが、
[
- 見てください。test
help [
答え2
@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
テスト:これをというスクリプトに入れ、セッションを終了した後でもスクリプトを実行し続けることができますnohup thescript &
。thescript
それがうまくいけば、それを終了し(シェルで毎回実行するのではなく)、現在の実行レベルで開始できるものにnohup
変換できます。daemon script
つまり、他のスクリプトをモデルとして使用して(少なくとも開始、停止、および状態セクションが必要です)、適切thescript
に変更できる次のものを配置し、適切なスクリプト/etc/rc.d/init.d
の下に通常のランレベル番号でシンボリックリンク名を指定します(参照:現在のランレベルの一番上の行)。また、各(またはほぼすべての)ランレベルには、ランレベルを切り替えるときにスクリプトを適切に終了するための適切なシンボリックリンクもあります。Sxxthescript
/etc/rc.d/rcN
N
who -a
Kxxthescript
または、systemdまたはディストリビューションで使用されているものと同等のもので実行/停止するために「適切なこと」を実行してください。