Wie kann ich eine Endlosschleife erstellen, die einen Prozess abbricht, wenn in dmesg etwas gefunden wird?

8

Ich muss eine whileSchleife erstellen dmesg, die einen bestimmten Prozess abbricht, wenn sie einen Wert zurückgibt.

Hier ist was ich habe.

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

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

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

else
    break
    fi
    done

Ich weiß nicht, ob ! -zich es tun soll[ test -n "$BUG" ]

Ich denke mit -n sagt es etwas über das Erwarten einer Binärdatei aus.

Ich weiß nicht, ob das Skript überhaupt funktioniert, da die BUG-Sperrung jeden Prozess anhält, aber es sind noch einige Zeilen vorhanden, dmesgbis der Computer vollständig ausgelastet ist - vielleicht kann ich den Prozess nachholen und beenden.

Niemand
quelle
2
Sie nehmen das gesamte dmesg, also werden Sie es nicht jedes Mal sehen, wenn die gesuchte Zeichenfolge einmal vorkommt, und somit alle bei jeder Schleife töten! (Zusätzlich zu den anderen Dingen, die @ l0b0 erwähnt hat, wie dem Mangel an Schlaf / Tempo usw.)
Olivier Dulac

Antworten:

12

Einige Fragen:

  • Sie führen dies in einer Besetztschleife aus, die so viele Ressourcen wie möglich verbraucht. Dies ist ein Fall, in dem sleepdies möglicherweise gerechtfertigt sein könnte.
  • Allerdings neuere Versionen von dmesgeinem Flag haben , um die Ausgabe zu folgen , so dass Sie das Ganze als (nicht getestet) umschreiben könntest

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
  • Der Code sollte eingerückt sein, um lesbar zu sein.
  • Es ist wirklich seltsam, aber es [ist dasselbe wie test- siehe help [.
l0b0
quelle
1
Wollten Sie hinzufügen, -qdamit das grep -q 'searchstringMenü verlassen wird dmesg --followund die nächste Zeile erreicht wird, sobald ein Vorkommen der Suchzeichenfolge angezeigt wird? Ohne sie erreicht Ihre Schleife weder den Killall noch die Schleife?
Olivier Dulac
1
Und selbst mit -q fürchte ich, dass Sie viel töten werden, wenn dmesg --follow einige Zeilen des dmesg-Kontexts zeigt (und somit die vorherigen Vorkommen zeigt), daher meine vorgeschlagene Antwort als Variante.
Olivier Dulac
@OlivierDulac Das letztere Problem sollte mit dem behoben werden tail.
10.
Was macht tail --lines=0das Ich weiß, was es für jeden anderen Wert bedeutet.
Joe
1
@Joe Es befindet sich in der Manpage - --followes folgen ( dh druckt) nur Zeilen, die nach dem Start des Befehls eintreffen.
10b0
9

Eine Variante der Antwort von @ 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.,"
        }'

Dies ist die Schleife, die einige Vorteile hat:

  • es wird funktionieren, bis dieser Prozess stirbt.
  • Es wird auch nicht mehr als 1 killallpro Auftreten des Suchstrings "BUG: Workqueue Lockup" aufgerufen, was die andere Antwort verbessert.

So testen Sie: Sie können dies in ein Skript mit dem Namen " thescriptand" einfügen nohup thescript &, damit thescriptes auch nach dem Beenden der Sitzung weiter ausgeführt wird.

Sobald Sie zufrieden sind, funktioniert es, töten Sie es und dann können Sie es (anstatt es jedes Mal in einer Shell mit auszuführen nohup) in ein verwandeln, daemon scriptdas Sie dann in Ihrem aktuellen Runlevel gestartet haben können.

dh: unter Verwendung eines anderen Skript als Modell (Sie müssen mindestens die Start-, Stop- und Statusabschnitte haben), können Sie ändern , in thescriptgeeigneter Weise und legen Sie es dann innerhalb /etc/rc.d/init.dund haben einen Symlink zu ihm benannt Sxxthescriptunter der entsprechenden (n) /etc/rc.d/rcN, Nwobei ein Nummer für Ihren normalen Runlevel (siehe die oberen Zeilen von who -a, um den aktuellen Runlevel zu erfahren). Und haben Sie auch die entsprechenden KxxthescriptSymlinks in jedem (oder fast jedem) Runlevel, so dass das Skript beim Wechseln des Runlevels angemessen beendet wird.

Oder tun Sie "die entsprechenden Dinge", damit es über systemd oder ein gleichwertiges System, das Ihre Distribution verwendet, ausgeführt / gestoppt wird.

Olivier Dulac
quelle
@ Niemand: Ich bin froh. Vergessen Sie nicht, die Antworten zu "akzeptieren" (grünes Häkchen), die Ihrer Meinung nach am besten erscheinen, es sei denn, Sie sind der Meinung, dass sie offen bleiben müssen, um weitere Antworten (oder Änderungen der aktuellen Antworten) zuzulassen.
Olivier Dulac
Beide Antworten sind richtig. Ich wünschte, ich könnte beide auswählen.
Niemand