Come posso creare un ciclo infinito che uccide un processo se si trova qualcosa in dmesg?


8

Ho bisogno di creare un whileciclo che, se dmesgrestituisce qualche / qualsiasi valore, dovrebbe interrompere un determinato processo.

Ecco quello che ho.

#!/bin/bash
while [ 1 ];
do

BUG=$(dmesg | grep "BUG: workqueue lockup" &> /dev/null)

    if [ ! -z "$BUG" ]; then
   killall someprocessname

else
    break
    fi
    done

Non so se invece di ! -zdovrei fare[ test -n "$BUG" ]

Penso che con -n dice qualcosa sull'aspettarsi un binario.

Non so se lo script funzionerà anche perché il blocco BUG interrompe ogni processo, ma ci sono ancora poche righe in più dmesgfino a quando il computer non viene completamente bloccato - forse posso recuperare e uccidere il processo.


2
Prendi l'intero dmesg, quindi una volta che si verifica un'occorrenza della stringa cercata, non la vedrai ogni volta e quindi ucciderai ad ogni ciclo! (Oltre alle altre cose citate da @000, come la mancanza di sonno / stimolazione, ecc.)
Olivier Dulac,

Risposte:


12

Qualche problema:

  • Lo stai eseguendo in un ciclo affollato, che consumerà quante più risorse possibile. Questo è un esempio in cui sleeping potrebbe essere plausibilmente giustificato.
  • Tuttavia, le versioni recenti di dmesghanno un flag per seguire l'output , quindi è possibile 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 [è lo stesso di test- vedi help [.

1
Intendevi aggiungere in -qmodo tale grep -q 'searchstringda uscire da dmesg --followe quindi consentire di raggiungere la riga successiva non appena viene rilevata un'occorrenza della stringa di ricerca? Senza di essa il tuo loop non raggiungerà il killall né il loop?
Olivier Dulac il

1
E anche con -q, temo che ucciderai molto, se dmesg --follow mostra alcune righe del contesto di dmesg (e quindi mostra le occorrenze precedenti), quindi la mia proposta di risposta come variante.
Olivier Dulac il

@OlivierDulac Quest'ultima questione dovrebbe essere risolta con il tail.
l0b0

Cosa fa tail --lines=0? So cosa significa per qualsiasi altro valore.
Joe,

1
@Joe È nella pagina man - con --followessa segue (cioè stampa) solo le linee che arrivano dopo l'avvio del comando.
l0b0

9

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

In questo modo facciamo il looping, che presenta alcuni vantaggi:

  • funzionerà fino alla fine di tale processo.
  • Inoltre, non chiama più di 1 killallper occorrenza della stringa di ricerca "BUG: workqueue lockup", che migliora sull'altra risposta.

Per testare: puoi inserirlo in uno script chiamato thescript, ed eseguirlo nohup thescript &, in modo che thescriptcontinui a funzionare anche dopo aver chiuso la sessione.

Una volta che sei soddisfatto, funziona, uccidilo e poi puoi (invece di eseguirlo ogni volta in una shell con nohup) trasformarlo in un daemon scriptche puoi aver iniziato nel tuo attuale runlevel.

vale a dire: usando un altro script come modello (è necessario disporre almeno delle sezioni start, stop e status), è possibile modificarlo in modo thescriptappropriato e quindi inserirlo all'interno /etc/rc.d/init.de disporre di un collegamento simbolico ad esso denominato Sxxthescriptsotto gli appropriati /etc/rc.d/rcN, Nessendo un numero per il tuo runlevel normale (vedi le prime righe who -aper conoscere l'attuale livello di run). E anche i Kxxthescriptcollegamenti simbolici appropriati , in ogni (o quasi) runlevel, in modo che lo script venga opportunamente ucciso quando si cambia runlevel.

Oppure fai "le cose appropriate" per farlo funzionare / arrestare tramite systemd o qualsiasi sistema equivalente utilizzato dalla tua distribuzione.


@Nobody: sono contento. Non dimenticare di "accettare" (segno di spunta verde) qualsiasi risposta sembri la migliore secondo te, a meno che tu non ritenga che debba rimanere aperta per consentire ulteriori risposte (o modifiche alle risposte attuali).
Olivier Dulac,

entrambe le risposte sono corrette vorrei poter selezionare entrambe.
Nessuno il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.