Alcuni problemi:
- Stai eseguendo questo in un ciclo occupato, che consumerà quante più risorse possibile. Questa è un'istanza in cui
sleeping potrebbe plausibilmente essere giustificato. -
Tuttavia, le versioni recenti di
dmesgavere 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
killallper 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.