GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso creare un ciclo infinito che uccida un processo se viene trovato qualcosa in dmesg?

Alcuni problemi:

  • Stai eseguendo questo in un ciclo occupato, che consumerà quante più risorse possibile. Questa è un'istanza in cui sleep ing potrebbe plausibilmente essere giustificato.
  • Tuttavia, le versioni recenti di dmesg avere 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 a test - vedi help [ .

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 killall per 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.


Linux
  1. Quattro compiti in parallelo... Come farlo?

  2. Come creare un file temporaneo nello script della shell?

  3. Cosa sono gli script di shell? Come creare script di shell?

  4. Come posso creare a livello di codice un nuovo cron job?

  5. Come creo un crontab attraverso uno script

Come creare script di shell

Come creare ed eseguire uno script di shell in Ubuntu 22.04

Come faccio a creare uno script di configurazione?

Come posso montare un'immagine disco?

Come arrestare manualmente uno script Python che viene eseguito continuamente su Linux

Come posso scrivere su dmesg dalla riga di comando?