GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

Einige Probleme:

  • Sie führen dies in einer Besetztschleife aus, die so viele Ressourcen wie möglich verbraucht. Dies ist eine Instanz, in der sleep ing durchaus gerechtfertigt sein könnte.
  • Neuere Versionen von dmesg ein Flag haben, um der Ausgabe zu folgen, sodass Sie das Ganze als (ungetestet) umschreiben könnten

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
    
  • Der Code sollte eingerückt sein, damit er lesbar ist.
  • Es ist wirklich seltsam, aber [ ist dasselbe wie test - siehe help [ .

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 lässt uns die Schleife ausführen, was einige Vorteile hat:

  • es wird funktionieren, bis dieser Prozess stirbt.
  • Es darf auch nicht mehr als 1 killall aufgerufen werden pro Vorkommen des Suchstrings "BUG:Workqueue Lockup", der die andere Antwort verbessert.

Zum Testen:Sie können dies in ein Skript namens thescript einfügen , und führen Sie nohup thescript & aus , sodass thescript läuft weiter, auch nachdem Sie Ihre Sitzung beendet haben.

Wenn Sie zufrieden sind, funktioniert es, beenden Sie es, und dann können Sie es (anstatt es jedes Mal in einer Shell mit nohup auszuführen). ) in einen daemon script umwandeln die Sie dann in Ihrem aktuellen Runlevel gestartet haben können.

dh:Wenn Sie ein anderes Skript als Modell verwenden (Sie müssen mindestens die Start-, Stopp- und Statusabschnitte haben), können Sie thescript ändern entsprechend und platzieren Sie es dann innerhalb von /etc/rc.d/init.d , und haben einen symbolischen Link namens Sxxthescript unter den entsprechenden /etc/rc.d/rcN , N eine Zahl für Ihren normalen Runlevel ist (siehe die obersten Zeilen von who -a um den aktuellen Runlevel zu kennen). Und den passenden Kxxthescript haben Symlinks auch in jedem (oder fast jedem) Runlevel, so dass das Skript beim Wechseln des Runlevels entsprechend beendet wird.

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


Linux
  1. Was sind Shell-Skripte? Wie erstelle ich Shell-Skripte?

  2. Wie kann ich programmgesteuert einen neuen Cron-Job erstellen?

  3. Wie erstelle ich eine Crontab über ein Skript

  4. Wie kann ich in einer Linux-Shell jede Zeile einer mehrzeiligen Zeichenfolge verarbeiten?

  5. Wie kann ich in jedem Ordner eine Datei erstellen?

So erstellen Sie Shell-Skripte

So erstellen Sie ein Skript eines Linux-Befehls

So erstellen und führen Sie ein Shell-Skript in Ubuntu 22.04 aus

Wie erstelle ich ein Konfigurationsskript?

So stoppen Sie manuell ein Python-Skript, das unter Linux kontinuierlich ausgeführt wird

Wie kann ich von der Befehlszeile aus in dmesg schreiben?