Některé problémy:
- Probíháte v rušné smyčce, která spotřebuje tolik zdrojů, kolik jen může. Toto je jeden případ, kdy
sleep
by mohla být oprávněná. -
Nejnovější verze
dmesg
mít příznak pro sledování výstupu, takže byste mohli celou věc přepsat jako (netestováno)while true do dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup' killall someprocessname done
- Kód by měl být odsazen, aby byl čitelný.
- Je to opravdu zvláštní, ale
[
je stejný jakotest
- vizhelp [
.
Varianta odpovědi @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.,"
}'
Toto pojďme awk udělat smyčkování, které má některé výhody:
- bude fungovat, dokud tento proces neukončí.
- Také nevolá více než 1
killall
na výskyt vyhledávacího řetězce „BUG:workqueue lockup“, který vylepšuje druhou odpověď.
Test:Můžete to vložit do skriptu s názvem thescript
a proveďte nohup thescript &
, takže thescript
bude pokračovat i po ukončení relace.
Jakmile budete spokojeni, že to funguje, zabijte ho a pak můžete (místo spouštění pokaždé v shellu s nohup
) převést jej na daemon script
které pak můžete spustit ve vaší aktuální úrovni běhu.
tj.:pomocí jiného skriptu jako modelu (musíte mít alespoň sekce start, stop a status), můžete upravit thescript
vhodně a poté jej umístěte do /etc/rc.d/init.d
a mít na něj symbolický odkaz s názvem Sxxthescript
pod příslušným(i) /etc/rc.d/rcN
, N
je to číslo pro vaši normální úroveň běhu (viz horní řádky who -a
znát aktuální úroveň běhu). A mít odpovídající Kxxthescript
také symbolické odkazy, v každém (nebo téměř ve všech) úrovních běhu, takže skript je při přepínání úrovní běhu náležitě zabit.
Nebo udělejte „příslušné věci“, abyste jej spustili/zastavili prostřednictvím systemd nebo jiného ekvivalentního systému, který vaše distribuce používá.