¿Cómo puedo crear un bucle infinito que mate un proceso si se encuentra algo en dmesg?

8

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
    done

No 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.

Nadie
fuente
2
Toma todo el dmesg, por lo que una vez que se produce una aparición de la cadena buscada, no la verá cada vez y, por lo tanto, se apagará en cada bucle. (Además de las otras cosas mencionadas por @ l0b0, como la falta de sueño / ritmo, etc.)
Olivier Dulac

Respuestas:

12

Algunos asuntos:

  • Está ejecutando esto en un bucle ocupado, que consumirá tantos recursos como sea posible. Esta es una instancia en 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)

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
  • El código debe tener sangría para que sea legible.
  • Es realmente extraño, pero [es lo mismo que testver help [.
l0b0
fuente
1
¿Quería agregar -qpara que grep -q 'searchstringsalga de la dmesg --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?
Olivier Dulac
1
E incluso con -q, me temo que matarás mucho, si dmesg --siguiente muestra algunas líneas de contexto dmesg (y por lo tanto muestra las ocurrencias anteriores), de ahí mi respuesta propuesta como una variante.
Olivier Dulac
@OlivierDulac El último problema debe solucionarse con el tail.
l0b0
¿Qué tail --lines=0hacer? Sé lo que significa para cualquier otro valor.
Joe
1
@Joe Está en la página de manual; con --followesto sigue (es decir, imprime) solo las líneas que llegan después de que se inicia el comando.
l0b0
9

Una variante de la respuesta de @ 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.,"
        }'

Vamos a hacer el bucle, que tiene algunas ventajas:

  • funcionará hasta que ese proceso muera.
  • Tampoco llama más de 1 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 hacer nohup thescript &, para que thescriptsiga 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 uno daemon 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 nombre Sxxthescriptdebajo de los apropiados /etc/rc.d/rcN, Nsiendo número para su nivel de ejecución normal (consulte las líneas superiores who -apara conocer el nivel de ejecución actual). Y tenga también los Kxxthescriptenlaces 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.

Olivier Dulac
fuente
@ Nadie: me alegro. No olvide "aceptar" (marca de verificación verde) las respuestas que le parezcan mejores en su opinión, a menos que sienta que debe permanecer abierto para permitir más respuestas (o modificaciones de las respuestas actuales).
Olivier Dulac
ambas respuestas son correctas, deseo poder seleccionar ambas.
Nadie