I want to execute a script on headphones disconnect but I resent the idea of constant polling of the status when there is already some code executed when it's changed.
2 Answers
In most systems if not all, ACPI can handle this event. To test that:
- Run
acpi_listen
Unplug & replug headphones, example output: (mic/ears share in same jack on my laptop)
jack/headphone HEADPHONE unplug jack/microphone MICROPHONE unplug jack/headphone HEADPHONE plug jack/microphone MICROPHONE plug
Put
your-script.sh
in/etc/acpi/
Add an event trigger file for your script in
/etc/acpi/events/
event=jack/headphone HEADPHONE unplug action=/etc/acpi/your-script.sh
Check the other files there to learn from.
You may need to restart
acpid
service to reload changed rules in/etc/acpi/events/
sudo service acpid restart
Reference: man acpid
-
Now I just have to find out how to make dbus work from ACPI scrips, but that's a different question.– int_uaJun 30, 2015 at 17:23
-
2@int_ua you need to write
DBUS_SESSION_BUS_ADDRESS
environ variable into a file in your homedir with a script started with~/.config/autostart/dbus.desktop
. Then you can runsu YOURUSER -c "DBUS_SESSION_BUS_ADDRESS=$(cat ~/.dbus_address) amixer ......."
from/etc/acpi/your-script.sh
– GermarJun 30, 2015 at 20:54 -
Hey, I wrote a script to show a notification. Followed exactly what you said. My script executes notify-send "Headphones connected" on plug event. BUt it doesn't seem to work. askubuntu.com/questions/877804/… Feb 2, 2017 at 16:24
The current version of your script now contains a sleep 0.25
command.
sleep
is timer-based so doesn't use any processing cycles while sleeping…
It does use a very tiny bit of CPU to set up the timer, but sleep 1
(sleep 1 second), sleep 60
(sleep for a minute) and sleep 86400
(sleep for a day) all use the same number CPU cycles.
Using ACPI however is the perfect solution as ACPI is event-driven instead of polling-driven.