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
には、コンピューターが完全に停止するまで、さらに数行あります。 。
いくつかの問題:
sleep
ingが正当化されると考えられる1つの例です。ただし、 最近のバージョンのdmesg
には、出力を追跡するフラグがあります なので、全体を(テストされていない)として書き換えることができます
while true
do
dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
killall someprocessname
done
[
は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.,"
}'
これは、ループをawkしてみましょう。これにはいくつかの利点があります。
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またはディストリビューションが使用する同等のシステムを介して実行/停止します。