udev-Regel zum Starten eines Befehls beim Ein-/Ausstecken von Wechselstrom/Batterie

udev-Regel zum Starten eines Befehls beim Ein-/Ausstecken von Wechselstrom/Batterie

Um Akku zu sparen, möchte ich die Effekte (Compositor) ausschalten, wenn der Laptop im Akkubetrieb läuft. Ich dachte, das ließe sich mit Udev-Regeln erreichen.

  • Eine Datei wurde erstellt /etc/udev/rules.d/99-myrule.rules:
ACTION=="change", SUBSYSTEM=="power_supply", RUN+="/usr/bin/startcompton.sh"

Diese Regel soll jedes Mal ausgelöst werden, wenn Sie den Laptop an die Stromversorgung anschließen/von der Stromversorgung trennen.

Anschließend aktualisiere ich die Regeln mit:sudo udevadm control -R

Leider löst das Anschließen/Abtrennen meiner Stromversorgung nichts aus.

Mein System ist Arch Linux.

Antwort1

Kurz zusammengefasst:

  1. Sorgen Sie dafür, dass mithilfe einer Udev-Regel ein Skript ausgeführt wird, um Ihre Anwendung (Compton) beim Trennen der Wechselstromverbindung zu beenden.

  2. Der erneute Start ist nicht ganz einfach: Erstellen Sie einen systemd-Dienst, um Ihre App zu starten, und verwenden Sie dann eine Udev-Regel, um diesen Dienst zu starten.

  3. Um Ihre udev-Regeln zu testen, verwenden Sieudevadm control --reload-rules && udevadm trigger


Antwort:

Ich habe also eine funktionierende Lösung gefunden. Die Frage bestand aus zwei Fragen, also lasst uns sie aufschlüsseln:

  1. Schreiben Sie eine Udev-Regel, die beim Ein-/Ausstecken von Wechselstrom/Batterien ausgeführt wird.
  2. So starten Sie eine GUI-Anwendung wie Compton über eine Udev-Regel.

Schreiben Sie eine Udev-Regel, die beim Ein-/Ausstecken von Wechselstrom/Batterien ausgeführt wird:

erstelle Datei /etc/udev/rules.d/60-onbattery.rules:

# Rule for when switching to battery
SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="0",RUN+="/bin/killcompton.sh"

und Datei erstellen /etc/udev/rules.d/61-onpower.rules:

# Rule for when switching to powersupply
SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="1",RUN+="/bin/startcompton.sh"

Beachten Sie, wie POWER_SUPPLY_ONLINEes von der Umgebung ist, umgeben vonENV{...}

Wenn Sie außerdem die Attribute für Ihre eigenen Regeln wissen möchten, überwachen Sie, was udev sieht, mit: udevadm monitor --environment

Wenn Ihr Skript lediglich eine Hintergrundaufgabe ist und keine GUI-bezogenen Prozesse aufruft, sind Sie fertig! Andernfalls lesen Sie weiter:

So starten Sie eine GUI-Anwendung wie Compton über eine Udev-Regel:

Ausudev manzur Verwendung von RUN:

„Dies kann nur für Aufgaben mit sehr kurzer Laufzeit verwendet werden …“

Das heißt, wir sollten etwas Dauerhaftes verwenden, wie zum BeispielsystemdService. Erstellen Sie eine Servicedatei: /etc/systemd/system/compton.service:

[Unit]
Description=Start compton

[Service]
Type=simple
Environment="DISPLAY=:0"
Environment="XAUTHORITY=%h/.Xauthority"
User=USERNAME
ExecStart=/bin/compton --blur-method kawase --write-pid-path %t/compton.pid
PIDFile=%t/compton.pid

[Install]
WantedBy=default.target

Ersetzen Sie es USERNAMEdurch Ihren Benutzernamen.

%hund %tsind Spezifizierer, die durch $HOMEund /runoder ersetzt werden $XDG_RUNTIME_DIR. systemd.unit(5)Weitere Einzelheiten finden Sie unter.

Die Zeile Environment="XAUTHORITY=/home/USERNAME/.Xauthority"ist ein Muss, wenn Sie eine GUI-Anwendung möchten. Bitte lesen SieDiese Antwort.

Und schließlich starten Sie in Ihrer Udev-Regel nicht Ihre GUI-Anwendung (in unserem Fall Compton), sondern den Dienst:

SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="1",RUN+="/bin/systemctl start compton"

Antwort2

Die vorhandene Antwort hat mir den Anfang gemacht, aber ich dachte, ich würde das Endergebnis für mich teilen – mein Anwendungsfall bestand darin, etwas zu tun (tatsächlich einen Smart Plug/ein Smart-Relais wegen eines seltsamen Netzteilproblems aus- und wieder einzuschalten), wenn ein Laptop keinen Strom mehr hatte.

Ich bin gestolpert, weil Udev-Regeln nicht mehrzeilig sein sollten und wenn doch, sollten sie maskiert werden.

Hier ist das Ergebnis:

# cat /etc/udev/rules.d/90-onbattery.rules                                                                                                                                                                                   
SUBSYSTEM=="power_supply",\
  ENV{POWER_SUPPLY_NAME}=="ADP1",\
  ENV{POWER_SUPPLY_ONLINE}=="0",\
  RUN+="/usr/bin/systemctl start power-cycle-outlet.service"
# cat /etc/systemd/system/power-cycle-outlet.service                                                                                                                                                                         
[Unit]
Description=Power Cycle Outlet via Home Assistant

[Service]
User=root
Type=simple
GuessMainPID=false
ExecStart=/usr/sbin/trigger-outlet-powercycle.sh

trigger-outlet-powercycle.shführt einen Netzwerkaufruf aus, sodass es aufgrund der Sandbox nicht direkt von udev aufgerufen werden kann, und ich konnte es nicht zum atLaufen bringen, aber systemd hat einwandfrei funktioniert.

Interessante Ressourcen, die zur Verbesserung der oben genannten Punkte verwendet werden könnten:

verwandte Informationen