10

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 2

12

In most systems if not all, ACPI can handle this event. To test that:

  1. Run acpi_listen
  2. 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
    
  3. Put your-script.sh in /etc/acpi/

  4. 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.

  5. You may need to restart acpid service to reload changed rules in /etc/acpi/events/

    sudo service acpid restart
    

Reference: man acpid

3
  • Now I just have to find out how to make dbus work from ACPI scrips, but that's a different question.
    – int_ua
    Jun 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 run su YOURUSER -c "DBUS_SESSION_BUS_ADDRESS=$(cat ~/.dbus_address) amixer ......." from /etc/acpi/your-script.sh
    – Germar
    Jun 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
1

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.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .