Ich möchte ein Skript ausführen, wenn die Kopfhörer getrennt werden, aber ich lehne die Idee ab, den Status ständig abzufragen, wenn bereits Code ausgeführt wird, wenn er geändert wird.
Ich möchte ein Skript ausführen, wenn die Kopfhörer getrennt werden, aber ich lehne die Idee ab, den Status ständig abzufragen, wenn bereits Code ausgeführt wird, wenn er geändert wird.
Antworten:
In den meisten Systemen, wenn nicht allen, kann ACPI dieses Ereignis verarbeiten. Um das zu testen:
acpi_listen
Kopfhörer ausstecken und wieder einstecken, Beispielausgabe: (Mikrofon / Ohren teilen sich die gleiche Buchse an meinem Laptop)
jack/headphone HEADPHONE unplug
jack/microphone MICROPHONE unplug
jack/headphone HEADPHONE plug
jack/microphone MICROPHONE plug
Setzen Sie your-script.sh
ein/etc/acpi/
Fügen Sie eine Ereignisauslösedatei für Ihr Skript in hinzu /etc/acpi/events/
event=jack/headphone HEADPHONE unplug
action=/etc/acpi/your-script.sh
Überprüfen Sie die anderen Dateien dort, um daraus zu lernen.
Möglicherweise müssen Sie den acpid
Dienst neu starten , um geänderte Regeln erneut zu laden/etc/acpi/events/
sudo service acpid restart
Referenz: man acpid
DBUS_SESSION_BUS_ADDRESS
die Umgebungsvariable mit einem Skript, mit dem begonnen wurde, in eine Datei in Ihrem Homedir schreiben ~/.config/autostart/dbus.desktop
. Dann können Sie su YOURUSER -c "DBUS_SESSION_BUS_ADDRESS=$(cat ~/.dbus_address) amixer ......."
von/etc/acpi/your-script.sh
Die aktuelle Version Ihres Skripts enthält jetzt einen sleep 0.25
Befehl.
sleep
ist timerbasiert, verwendet also keine Verarbeitungszyklen im Schlaf…
Es wird zwar ein sehr kleines Stück CPU zum Einrichten des Timers verwendet, aber sleep 1
(1 Sekunde schlafen), sleep 60
(eine Minute sleep 86400
schlafen ) und (einen Tag schlafen) verwenden alle die gleiche Anzahl von CPU-Zyklen.
Die Verwendung von ACPI ist jedoch die perfekte Lösung, da ACPI ereignisgesteuert statt abrufgesteuert ist.