いくつかの問題:
- これをビジー ループで実行しているため、できるだけ多くのリソースを消費します。これは
sleep
の 1 つのインスタンスです。 ことは正当化される可能性があります。 -
ただし、最近のバージョンの
dmesg
出力に続くフラグがあるため、全体を (untest) として書き換えることができます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.,"
}'
これにより、いくつかの利点があるループを実行できます:
- そのプロセスが終了するまで動作します。
- また、複数の
killall
を呼び出しません。 検索文字列「BUG:workqueue lockup」の出現ごとに、他の回答を改善します。
テストするには:これを thescript
という名前のスクリプトに入れることができます 、および nohup thescript &
を実行します 、だから thescript
セッションを終了しても実行し続けます。
動作することに満足したら、それを強制終了してください (nohup
を使用してシェルで毎回実行する代わりに) ) daemon script
に変換します その後、現在のランレベルで開始できます。
つまり、別のスクリプトをモデルとして使用すると (少なくとも開始、停止、およびステータスのセクションが必要です)、thescript
を変更できます。 適切に配置し、/etc/rc.d/init.d
内に配置します。 、そして Sxxthescript
という名前のシンボリックリンクを持っています 適切な /etc/rc.d/rcN
の下 、 N
通常のランレベルの数値です (who -a
の一番上の行を参照) 現在のランレベルを知るため)。そして、適切な Kxxthescript
を持っています ランレベルを切り替えるときにスクリプトが適切に強制終了されるように、すべての (またはほぼすべての) ランレベルでシンボリック リンクも使用します。
または、「適切なこと」を実行して、systemd またはディストリビューションが使用する同等のシステムを介して実行/停止します。