GNU/Linux >> Tutoriales Linux >  >> Linux

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

Algunos problemas:

  • Está ejecutando esto en un bucle ocupado, lo que consumirá tantos recursos como sea posible. Esta es una instancia donde sleep posiblemente podría estar justificado.
  • Sin embargo, las versiones recientes de dmesg tener un indicador para seguir la salida, por lo que podría reescribir todo como (no probado)

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
    
  • El código debe estar sangrado para que sea legible.
  • Es realmente extraño, pero [ es lo mismo que test - ver help [ .

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.,"
        }'

Esto vamos a hacer el bucle, lo que tiene algunas ventajas:

  • funcionará hasta que ese proceso muera.
  • Tampoco llame a más de 1 killall por aparición de la cadena de búsqueda "ERROR:bloqueo de la cola de trabajo", que mejora la otra respuesta.

Para probar:puede poner esto en un script llamado thescript y haz nohup thescript & , de modo que thescript seguirá ejecutándose incluso después de salir de la sesión.

Una vez que esté satisfecho de que funciona, elimínelo y podrá hacerlo (en lugar de ejecutarlo cada vez en un shell con nohup ) transformarlo en un daemon script que luego puede haber comenzado en su nivel de ejecución actual.

es decir:usando otro script como modelo (debe tener al menos las secciones de inicio, parada y estado), puede modificar thescript apropiadamente y luego colóquelo dentro de /etc/rc.d/init.d , y tenga un enlace simbólico llamado Sxxthescript bajo los correspondientes /etc/rc.d/rcN , N siendo un número para su nivel de ejecución normal (vea las líneas superiores de who -a para conocer el nivel de ejecución actual). Y tener el Kxxthescript apropiado enlaces simbólicos también, en todos (o casi todos) los niveles de ejecución, de modo que el script se elimine adecuadamente al cambiar de nivel de ejecución.

O haga "las cosas apropiadas" para que se ejecute/detenga a través de systemd o cualquier sistema equivalente que use su distribución.


Linux
  1. ¿Qué son los scripts de Shell? ¿Cómo crear scripts de Shell?

  2. ¿Cómo puedo crear mediante programación un nuevo trabajo cron?

  3. ¿Cómo puedo saber qué proceso está usando swap?

  4. ¿Cómo puedo probar mi script Bash en versiones anteriores de Bash?

  5. ¿Cómo puedo montar una imagen de disco?

Cómo crear scripts de shell

Cómo crear y ejecutar un script de shell en Ubuntu 22.04

En un shell de Linux, ¿cómo puedo procesar cada línea de una cadena de varias líneas?

¿Cómo puedo crear un archivo en cada carpeta?

¿Cómo creo un script de configuración?

¿Cómo puedo crear un usuario que no inicie sesión?