ubuntuusers.de

Akkuwarnung für die Shell

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

T0m

Anmeldungsdatum:
26. August 2005

Beiträge: 223

Wohnort: MA

Hallo !

sed und awk sind mir noch unbekannt, aber ich möchte versuchen ein Skript
zu schreiben, was folgendes tut:
1.) checken ob KDM bzw. GDM läuft
2.) wenn ja, starte bei 1. nach einer kleinen Zeitspanne - wenn nein, dann:
3.) acpi -b Ausgabe auf den Ladestand untersuchen und bei 6 - 9 %
dann die erste Warnung per wall verschicken.
4.) acpi -b Ausgabe auf den Ladestand untersuchen und bei gleich oder weniger als 5 %
das Herunterfahren erzwingen.

Meint ihr, daß man mit sed und awk das brauchbar lösen kann oder lieber doch Perl oder
Phyton dafür nehmen bzw. gibt es gar schon was fertiges dafür ?

adun Team-Icon

Avatar von adun

Anmeldungsdatum:
29. März 2005

Beiträge: 8606

Klar kann man natürlich mit Perl oder Python machen, aber warum nicht die Modularität der bash nutzen? Das sind 10 Zeilen Bash Script und die dann einfach per cron alle 10 Minuten ausführen.
So würde ich es jedenfalls machen.
Alles was du brauchst findest du hier: http://www.linuxfibel.de/bashprog.htm

T0m

(Themenstarter)

Anmeldungsdatum:
26. August 2005

Beiträge: 223

Wohnort: MA

Okay, ist soweit fertig.
Jetzt müßte ich nur noch wissen, welche Umgebungsvariable gesetzt wird wenn der KDE läuft
bzw. welche Datei erstellt wird, die besagt, daß der KDE gerade läuft.
Weil dann braucht mein Programm nichts zu tun, weil das der KDE ja dann übernimmt.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

ps -o pid= -C gdm

liefert mir eine Liste aller Prozess-IDs des gdm - unter KDE sollte kdm statt gdm ein ebenso taugliches Mittel zu sein.
Falls Du für X11/ KDE einen eigenen Runlevel hast (oft für X11: 5, console: 3), dann sollte auch eine schlichtes

runlevel

weiterhelfen.

T0m

(Themenstarter)

Anmeldungsdatum:
26. August 2005

Beiträge: 223

Wohnort: MA

Das ist eine gute Idee mit ps.
Da wäre ich jetzt gar nicht drauf gekommen.
Allerdings muß ich schon nach KDE suchen, weil der KDM ja keinerlei ACPI-Warn- und Shutdown-Funktionen hat oder doch ?
Sowas sehe ich nur wenn der KDE da ist. (Geht wahrscheinlich genauso mit dem Gnome.)
GDM hat sowas sicherlich auch nicht.
Daher muß ich doch eher danach suchen ...

T0m

(Themenstarter)

Anmeldungsdatum:
26. August 2005

Beiträge: 223

Wohnort: MA

Ich hätte jetzt nur noch ein Problem mit der Akkuanzeige an sich.
Weil acpi -b entweder 100% (3-stellig), z.B. 55% (2-stellig) und 8% (einstellig) angibt
und somit folgender Muster-Such-Versuch nicht mehr funktioniert:

state=$(acpi -b | grep -so ",.*%" | grep -so "[[:digit:]][[:digit:]]")


Das funktioniert ja nur korrekt so lange wie die Ausgabe von "acpi -b" >= 10 && =< 99 ist ...
Man könnte das natürlich recht umständlich mit vielen If's soweit verschachteln, so daß man erst auf was korrektes 3stelliges sucht dann auf etwas korrektes 2stelliges und dann was korrektes einstelliges.
Wenn's dann nicht einstellig ist, tue nichts. Ansonsten mache dies und jenes ...
Aber das geht doch sicherlich auch schöner. Bloß bin ich mit grep nicht so bewandert, was das angeht.
Daher müßte ich das jetzt wissen, bevor ich groß weiter mache.

EDIT: Natürlich nehme ich auch gerne was an, was nur bis etwas 2stelliges heruntergeht.
Vielleicht ist eine Warnung bei 8-12% vielleicht besser angebracht und erst ab 7 ein gezwungener Shutdown als die im 1. angegebenen niedrigeren Werte (rein so zur Sicherheit.)

haraldkl

Avatar von haraldkl

Anmeldungsdatum:
21. Juli 2005

Beiträge: 1903

Wohnort: Würselen

Hi,
du kannst mit curly braces angeben, wie oft dein Muster vorkommen soll:

grep -so "[[:digit:]]{1,3}"


Mit: {min,max} Muster wird mindestens "min" mal und maximal "max" mal vorgefunden 😉

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Darf's ein wenig sed sein?

acpi -b | grep Battery | sed 's/.*, //g;s/%//g'

Allerdings beherzigt diese Variante kein 'charging', so daß der Rechner bei dann bei weniger als <Schwellwert> beim Laden runtergefahren wird - ☺ - nicht sehr komisch ☺

Daher vielleicht doch eher:
mit

status=$(acpi -b | grep Battery)
echo $status | grep -q charg && exit
prozent=$(echo $status | sed 's/.*, //g;s/%//g')

T0m

(Themenstarter)

Anmeldungsdatum:
26. August 2005

Beiträge: 223

Wohnort: MA

Hallo !

Ja, das meine Variante das noch nicht beherzigt ist mir wohl bewußt.
Ist mir schon gestern Nacht aufgefallen, daß man vielleicht dran denken sollte,
ob nicht evtl. vor der Ausführung des Skriptes beim Schwellenwert für den Shutdown
bereits das Kabel wieder eingesteckt wurde.
Das hätte ich dann vor dem Shutdown mittels einem "ungleich grep auf uncharging" gelöst.
(Weil charging wäre als Wortkette ja in beiden Begriffen ...)
Bzw. man könnte auch nach "charged" suchen und dann ob das auch gefunden wird.
Das ginge genauso.

Jetzt versuch ich mal dein Skript zu verstehen. ☺
EDIT: Blick ich noch net so ganz. *g*
grep -q blablub endet immer mit Exitstatus 0
&& ist doch ein logisches Und ?
Dann geht das Und doch nur bei 1 los ... oder versteh ich da was falsch, weil sonst
wäre es ja ein NAND.

Und die Zeile mit Prozent ergibt genau den Rest der Zeile nach dem % Zeichen ...

EDIT 2:
Das mit grep -so [[:digit:]]{1,3} bringt leider in Kombination mit acpi blablabla leider
gar keinen Output mehr. ☹

adun Team-Icon

Avatar von adun

Anmeldungsdatum:
29. März 2005

Beiträge: 8606

Ja das Skript von Unknown macht keinen Sinn, wenn Battery bei nicht laden uncharge ausgibt. Wie du ja selber schreibts ist greppen nach uncharge sinnvoller. Das && ist mehr sowas wie ein forderndes 'und'. Bei einem Exitstatus von 1 wird der zweite Prozess eifnach nicht ausgeführt.

haraldkl

Avatar von haraldkl

Anmeldungsdatum:
21. Juli 2005

Beiträge: 1903

Wohnort: Würselen

T0m hat geschrieben:

Das mit grep -so [[:digit:]]{1,3} bringt leider in Kombination mit acpi blablabla leider
gar keinen Output mehr. ☹

OK, sorry die curly Braces gehören in die eckigen Klammern:

[[:digit:]{1,3}]

8)

T0m

(Themenstarter)

Anmeldungsdatum:
26. August 2005

Beiträge: 223

Wohnort: MA

Das tut leider auch nicht wie gewünscht ... das ergibt leider im Kombination mit den anderen Befehlen einen Output von: 3 Zeilen mit dem Inhalt:
,
7
0

wobei 70% der aktuelle Akkustand wären.

Aber macht nichts, ich hab mir was mit SED gebastelt, was funktioniert.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Ja das Skript von Unknown macht keinen Sinn, wenn Battery bei nicht laden uncharge ausgibt. Wie du ja selber schreibts ist greppen nach uncharge sinnvoller. Das && ist mehr sowas wie ein forderndes 'und'. Bei einem Exitstatus von 1 wird der zweite Prozess eifnach nicht ausgeführt.

Richtig - man sollte doch immer prüfen was man macht.
Bei mir gibt es 'discharging' aus, was genauso schlecht ist, um nach 'charge' zu greppen.
Ich korrigiere also zu:

status=$(acpi -b | grep Battery)
echo $status | grep -q discharg || exit
prozent=$(echo $status | sed 's/.*, //g;s/%//g')

&& und || sind 'kurzschließende logische Operatoren.
Ein Und-Ausdruck ist nur wahr, wenn beide Teilausdrücke wahr sind, so daß man zweiten Ausdruck nicht prüfen muß, wenn der erste bereits falsch ist.
Ein Oder-Ausdruck ist genau dann wahr, wenn mindestens einer der Teilausdrücke wahr ist, so daß der 2. Ausdruck nicht getestet werden muß, wenn bereits der erste wahr war.
Die shell berücksichtigt dies bei && und || und verhält sich entsprechend effizient.

Erkannt habt Ihr das richtig, aber die Erklärungen haben mich nicht ganz zufriedengestellt ☺

Antworten |