dmesgで何かが見つかったら、プロセスを終了するために無限ループをどのように作成できますか?

dmesgで何かが見つかったら、プロセスを終了するために無限ループをどのように作成できますか?

一部/何らかの値が返される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

いくつかの問題:

  • できるだけ多くのリソースを消費する忙しいループで実行しています。これはsleepingが合理的であると想像できる例です。
  • しかし、最新バージョンにはdmesg出力に続くフラグがあります。だから、全体の内容を(テストされていない)として書き換えることができます。

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
    
  • コードを読みやすいようにインデントする必要があります。
  • これは本当に奇妙ですが、[- 見てください。testhelp [

答え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/rcNNwho -aKxxthescript

または、systemdまたはディストリビューションで使用されているものと同等のもので実行/停止するために「適切なこと」を実行してください。

関連情報