web-dev-qa-db-ja.com

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には、コンピューターが完全に停止するまで、さらに数行あります。 。

8
Nobody

いくつかの問題:

  • これをビジーループで実行すると、可能な限り多くのリソースが消費されます。これは、sleepingが正当化されると考えられる1つの例です。
  • ただし、 最近のバージョンのdmesgには、出力を追跡するフラグがあります なので、全体を(テストされていない)として書き換えることができます

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
    
  • コードは読みやすいようにインデントする必要があります。
  • 奇妙ですが、[testと同じです-help [を参照してください。
12
l0b0

@ 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してみましょう。これにはいくつかの利点があります。

  • そのプロセスが死ぬまで機能します。
  • また、検索文字列「BUG:workqueue lockup」の発生ごとに1を超えるkillallを呼び出さないため、他の回答が改善されます。

テストするには:これをthescriptという名前のスクリプトに入れ、Nohup thescript &を実行します。これにより、セッションを終了した後でもthescriptが引き続き実行されます。

満足したらそれが機能し、それを殺すと、(Nohupを使用してシェルで毎回実行する代わりに)daemon scriptに変換して現在の状態で開始することができますランレベル。

つまり、別のスクリプトをモデルとして使用して(少なくともstart、stop、statusセクションが必要です)、thescriptを適切に変更して/etc/rc.d/init.d内に配置し、シンボリックリンクを作成します適切な/etc/rc.d/rcNの下でSxxthescriptという名前が付けられ、Nは通常のランレベルの番号です(現在のランを知るにはwho -aの上の行を参照してください)レベル)。また、すべての(またはほぼすべての)ランレベルに適切なKxxthescriptシンボリックリンクを設定して、ランレベルを切り替えるときにスクリプトが適切に強制終了されるようにします。

または、「適切なこと」を実行して、systemdまたはディストリビューションが使用する同等のシステムを介して実行/停止します。

9
Olivier Dulac