Necesito crear un while
bucle que si dmesg
devuelve 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
done
No sé si en lugar de ! -z
hacerlo 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 dmesg
hasta que la computadora se traba por completo, tal vez pueda ponerme al día y matar el proceso.
Respuestas:
Algunos asuntos:
sleep
la que posiblemente podría justificarse ing.Sin embargo, las versiones recientes de
dmesg
tienen un indicador para seguir la salida , por lo que podría reescribir todo como (sin probar)[
es lo mismo quetest
verhelp [
.fuente
-q
para quegrep -q 'searchstring
salga de ladmesg --follow
y, 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=0
hacer? Sé lo que significa para cualquier otro valor.--follow
esto 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:
killall
por 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
thescript
y hacernohup thescript &
, para quethescript
siga 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 script
que 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
thescript
apropiadamente y luego colocarlo dentro/etc/rc.d/init.d
, y tener un enlace simbólico con el nombreSxxthescript
debajo de los apropiados/etc/rc.d/rcN
,N
siendo número para su nivel de ejecución normal (consulte las líneas superioreswho -a
para conocer el nivel de ejecución actual). Y tenga también losKxxthescript
enlaces 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