Wie kann ich ein Skript ausführen, wenn das Netzteil angeschlossen oder ausgeschaltet ist?


8

Aus irgendeinem Grund wird die Bildschirmhelligkeit meines Laptops nicht aktualisiert, wenn ich das Netzteil ein- oder ausstecke. Ich habe mir einige Lösungen für dieses Problem angesehen, aber keine davon schien gut zu funktionieren. Anstatt zu verzweifeln und aufzugeben, beschloss ich, dies in eine Lernerfahrung umzuwandeln und zu prüfen, ob ich kein Skript schreiben kann, das dies für mich erledigt.

Ich habe versucht, es selbst herauszufinden, natürlich mit Hilfe des Internets, aber ich bin ziemlich neu in Bash Scripting und Ubuntu im Allgemeinen, also bin ich nicht weit gekommen.

Was ich herausfinden konnte war, dass ich den Zustand der Batterie mit finden kann

$ upower -i /org/freedesktop/UPower/devices/battery_BAT1 | grep -E "state"
state:     charging/discharging

Je nachdem, ob das Netzteil angeschlossen ist oder nicht. Ich weiß nicht, ob das überhaupt nützlich ist, aber es ist irgendwie cool, und ich wusste vorher nicht, wie man es benutzt. grepWas zum Teufel, Lernen macht Spaß.

Gibt es einen etwas sauberen Weg, dies zu tun? Mit "sauberer Weg" meine ich nur einen Weg, den jemand mit begrenzter Erfahrung mit Bash-Skripten verstehen kann.

Eine ähnliche Frage, die ich gefunden habe und die eine gute Antwort hatte, ist diese , die Folgendes sagt:

Wenn Sie das Netzteil ein- oder ausstecken, werden die Skripte /etc/pm/power.dmit> einem Argument aufgerufen: "true" (wenn Sie mit Batterie arbeiten) oder "false" (wenn Sie mit dem Netzteil arbeiten).

Das Problem ist, dass ich nicht weiß, wie ich über ein Skript auf dieses Argument zugreifen kann. Ich denke, alles läuft auf ein ziemlich einfaches Problem hinaus, aber ich dachte, ich würde die Frage trotzdem posten, falls die Leute bessere Lösungen hätten.

Antworten:


5

Sie können on_ac_powerein Skript ausführen, wenn die Stromversorgung ein- oder ausgeschaltet ist.

Versuchen Sie Folgendes in einem Terminal.

$ on_ac_power
$ echo $?
0              ## Laptop on ac power

$ on_ac_power
$ echo $?
1              ## Laptop on battery (not on ac power)

Basierend darauf können Sie Ihr Skript wie folgt erstellen:

#!/bin/bash
while true
do
    if on_ac_power; then 
        do_something               ## Laptop on power
    else
        do_something_else          ## Laptop on battery
    fi
    sleep 10                       ## wait 10 sec before repeating
done

EDIT: [vorgeschlagen von KasiyA ]

cron job wäre eine bessere Idee, um das Skript in regelmäßigen Abständen auszuführen, anstatt eine Endlosschleife zu verwenden.

Speichern Sie Ihr Skript als myscript.shund fügen Sie den folgenden Inhalt ein:

#!/bin/bash
if on_ac_power; then 
    do_something
else
    do_something_else
fi

Machen Sie das Skript von einem Terminal aus ausführbar chmod +x /path/to/myscript.sh. Öffnen Sie Ihr persönliches crontabas EDITOR=gedit crontab -eund fügen Sie die folgende Zeile hinzu, um Ihr Skript jede Minute auszuführen.

* * * * * /path/to/myscript.sh 

Ist es eine schlechte Praxis, Skripte unendlich laufen zu lassen, oder passiert das regelmäßig und ist in das System integriert? Ich glaube, ich habe nach einer Art Auslöser gesucht, aber wenn dies funktioniert, ist es viel weniger kompliziert als ich angenommen hatte.
Jasper

@ TheQZ: Ich denke, 'Souravc' hat die Grundidee gegeben .. Sie können Ihre eigenen basierend darauf schreiben :)
heemayl

@TheQZ Obwohl es für immer läuft, aber nur einmal pro 10 Sekunden aktiv wird (Sie können die Prüfzeit erhöhen) Schauen Sie sich die Frage an, wie ein Befehl jedes x-Intervall wiederholt wird . Andernfalls müssen Sie Ihr eigenes Daemon-Programm schreiben, was für Anfänger sehr kompliziert ist.
Souravc

@TheQZ Sie können die Antwort von souravc als Cron- Job verwenden. siehe zweiten Teil meiner Antwort
αғsнιη

2
Ein besserer Weg ist die Verwendung der udev-Regel wie in askubuntu.com/questions/613741/… .
Anthony Wong
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.