Ich muss eine while
Schleife 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 ! -z
ich 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, dmesg
bis der Computer vollständig ausgelastet ist - vielleicht kann ich den Prozess nachholen und beenden.
Antworten:
Einige Fragen:
sleep
dies möglicherweise gerechtfertigt sein könnte.Allerdings neuere Versionen von
dmesg
einem Flag haben , um die Ausgabe zu folgen , so dass Sie das Ganze als (nicht getestet) umschreiben könntest[
ist dasselbe wietest
- siehehelp [
.quelle
-q
damit dasgrep -q 'searchstring
Menü verlassen wirddmesg --follow
und die nächste Zeile erreicht wird, sobald ein Vorkommen der Suchzeichenfolge angezeigt wird? Ohne sie erreicht Ihre Schleife weder den Killall noch die Schleife?tail
.tail --lines=0
das Ich weiß, was es für jeden anderen Wert bedeutet.--follow
es folgen ( dh druckt) nur Zeilen, die nach dem Start des Befehls eintreffen.Eine Variante der Antwort von @ l0b0:
Dies ist die Schleife, die einige Vorteile hat:
killall
pro 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 "
thescript
and" einfügennohup thescript &
, damitthescript
es 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 script
das 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
thescript
geeigneter Weise und legen Sie es dann innerhalb/etc/rc.d/init.d
und haben einen Symlink zu ihm benanntSxxthescript
unter der entsprechenden (n)/etc/rc.d/rcN
,N
wobei ein Nummer für Ihren normalen Runlevel (siehe die oberen Zeilen vonwho -a
, um den aktuellen Runlevel zu erfahren). Und haben Sie auch die entsprechendenKxxthescript
Symlinks 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.
quelle