Necesito crear un whilebucle que si dmesgdevuelve algún / cualquier valor, entonces debería matar un proceso determinado.
Aquí está lo que tengo.
#!/bin/bash
while [ 1 ];
do
BUG=$(dmesg | grep "BUG: workqueue lockup" &> /dev/null)
    if [ ! -z "$BUG" ]; then
   killall someprocessname
else
    break
    fi
    doneNo sé si en lugar de ! -zhacerlo debería[ test -n "$BUG" ]
Creo que con -n dice algo acerca de esperar un binario.
No sé si el script incluso funcionará porque el bloqueo de BUG detiene todos los procesos, pero aún hay algunas líneas más dmesghasta que la computadora se traba por completo, tal vez pueda ponerme al día y matar el proceso.

Respuestas:
Algunos asuntos:
sleepla que posiblemente podría justificarse ing.Sin embargo, las versiones recientes de
dmesgtienen un indicador para seguir la salida , por lo que podría reescribir todo como (sin probar)[es lo mismo quetestverhelp [.fuente
-qpara quegrep -q 'searchstringsalga de ladmesg --followy, de este modo, llegar a la siguiente línea tan pronto como vea una aparición de la cadena de búsqueda? Sin él, ¿tu bucle no alcanzará el killall ni el bucle?tail.tail --lines=0hacer? Sé lo que significa para cualquier otro valor.--followesto sigue (es decir, imprime) solo las líneas que llegan después de que se inicia el comando.Una variante de la respuesta de @ l0b0:
Vamos a hacer el bucle, que tiene algunas ventajas:
killallpor aparición de la cadena de búsqueda "ERROR: bloqueo de la cola de trabajo", que mejora con respecto a la otra respuesta.Para probar: puede poner esto en un script llamado
thescripty hacernohup thescript &, para quethescriptsiga ejecutándose incluso después de salir de la sesión.Una vez que esté satisfecho, funciona, elimínelo y luego puede (en lugar de ejecutarlo cada vez en un shell con
nohup) transformarlo en unodaemon scriptque luego pueda haber comenzado en su nivel de ejecución actual.es decir: usando otro script como modelo (debe tener al menos las secciones de inicio, detención y estado), puede modificarlo
thescriptapropiadamente y luego colocarlo dentro/etc/rc.d/init.d, y tener un enlace simbólico con el nombreSxxthescriptdebajo de los apropiados/etc/rc.d/rcN,Nsiendo número para su nivel de ejecución normal (consulte las líneas superioreswho -apara conocer el nivel de ejecución actual). Y tenga también losKxxthescriptenlaces simbólicos apropiados , en cada (o casi todos) niveles de ejecución, de modo que el script se elimine adecuadamente al cambiar los niveles de ejecución.O haga "lo apropiado" para que se ejecute / detenga a través de systemd o cualquier sistema equivalente que utilice su distribución.
fuente