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.