Alcuni problemi:
- Stai eseguendo questo in un ciclo occupato, che consumerà quante più risorse possibile. Questa è un'istanza in cui
sleep
ing potrebbe plausibilmente essere giustificato. -
Tuttavia, le versioni recenti di
dmesg
avere un flag per seguire l'output, quindi puoi riscrivere il tutto come (non testato)while true do dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup' killall someprocessname done
- Il codice deve essere rientrato per essere leggibile.
- È davvero strano, ma
[
è uguale atest
- vedihelp [
.
Una variante della risposta 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.,"
}'
Questo permette awk di eseguire il looping, che presenta alcuni vantaggi:
- funzionerà fino alla morte del processo.
- Inoltre, non chiama più di 1
killall
per occorrenza della stringa di ricerca "BUG:workqueue lockup", che migliora rispetto all'altra risposta.
Per testare:puoi inserirlo in uno script chiamato thescript
, e fai nohup thescript &
, in modo che thescript
continuerà a funzionare anche dopo che avrai abbandonato la sessione.
Una volta che sei soddisfatto funziona, uccidilo e poi puoi (invece di eseguirlo ogni volta in una shell con nohup
) trasformalo in un daemon script
che puoi quindi aver avviato nel tuo attuale runlevel.
ad esempio:usando un altro script come modello (devi avere almeno le sezioni start, stop e status), puoi modificare thescript
in modo appropriato e poi posizionalo all'interno di /etc/rc.d/init.d
, e avere un collegamento simbolico ad esso chiamato Sxxthescript
sotto l'appropriato/i /etc/rc.d/rcN
, N
essere un numero per il tuo normale runlevel (vedi le prime righe di who -a
per conoscere il run-level corrente). E avere il Kxxthescript
appropriato anche i collegamenti simbolici, in tutti (o quasi tutti) i runlevel, in modo che lo script venga terminato in modo appropriato quando si cambia runlevel.
Oppure fai "le cose appropriate" per farlo funzionare/arrestare tramite systemd o qualsiasi sistema equivalente utilizzato dalla tua distribuzione.