Difference between revisions of "Acpid"

From ArchWiki
Jump to: navigation, search
(Tips and tricks: note, that backlight/wi-fi is not always controllable)
(Getting user name of the current display: fix section link)
 
(104 intermediate revisions by 22 users not shown)
Line 1: Line 1:
{{lowercase title}}
+
{{Lowercase title}}
 
[[Category:Power management]]
 
[[Category:Power management]]
 +
[[es:Acpid]]
 
[[it:Acpid]]
 
[[it:Acpid]]
[[zh-CN:Acpid]]
+
[[ja:Acpid]]
 
+
[[ru:Acpid]]
[http://acpid.sourceforge.net/ acpid] is a flexible and extensible daemon for delivering [[ACPI modules|ACPI events]]. It listens on {{ic|/proc/acpi/event}} and when an event occurs, executes programs to handle the event. These events are triggered by certain actions, such as:
+
[[zh-cn:Acpid]]
 +
{{Related articles start}}
 +
{{Related|ACPI modules}}
 +
{{Related|DSDT}}
 +
{{Related articles end}}
 +
[http://acpid2.sourceforge.net/ acpid2] is a flexible and extensible daemon for delivering [[ACPI modules|ACPI events]]. When an event occurs, it executes programs to handle the event. These events are triggered by certain actions, such as:
 
* Pressing special keys, including the Power/Sleep/Suspend button
 
* Pressing special keys, including the Power/Sleep/Suspend button
 
* Closing a notebook lid
 
* Closing a notebook lid
Line 10: Line 16:
 
* (Un)Plugging phone jack etc.
 
* (Un)Plugging phone jack etc.
  
acpid can be used by itself, or combined with a more robust system such as [[pm-utils]] and [[CPU Frequency Scaling|cpufrequtils]] to provide a more complete power management solution.
+
{{Note|[[Desktop environments]], such as [[GNOME]], [[Power management#ACPI events|systemd]] login manager and some [[Extra keyboard keys|extra key handling]] daemons may implement own event handling schemes, independent of acpid. Running more than one system at the same time may lead to unexpected behaviour, such as suspending two times in a row after one sleep button press. You should be aware of this and only activate desirable handlers.}}
 
+
{{Note|
+
* [[Desktop Environment|desktop environments]], such as [[GNOME]], [[Systemd#ACPI power management|systemd]] login manager and some [[Extra Keyboard Keys|extra key handling]] daemons may implement own event handling schemes, independent of acpid. Running more than one system at the same time may lead to unexpected behaviour, such as suspending two times in a row after one sleep button press. You should be aware of this and only activate desirable handlers.
+
* Since by default the script provided by acpid, '''/etc/acpi/handler.sh''', will override your desktop environment's power button functionality, you most likely want to change acpid's power off routine to avoid shutting down the system suddenly when you press the power button (see instructions below).}}
+
  
 
== Installation ==
 
== Installation ==
  
[[pacman|Install]] the {{Pkg|acpid}} package, available in the [[Official Repositories|official repositories]].
+
[[Install]] the {{Pkg|acpid}} package. Then [[start]] and/or [[enable]] {{ic|acpid.service}}.
 
+
To have it start on boot :
+
* if you're using [[systemd]], run {{ic|systemctl enable acpid}} ;
+
* if you're using [[rc.conf|initscripts]], edit {{ic|/etc/rc.conf}} as root and add {{ic|acpid}} to the [[rc.conf#Daemons|DAEMONS array]].
+
  
 
== Configuration ==
 
== Configuration ==
Line 28: Line 26:
 
{{Pkg|acpid}} comes with a number of predefined actions for triggered events, such as what should happen when you press the Power button on your machine. By default, these actions are defined in {{ic|/etc/acpi/handler.sh}}, which is executed after any ACPI events are detected (as determined by {{ic|/etc/acpi/events/anything}}).
 
{{Pkg|acpid}} comes with a number of predefined actions for triggered events, such as what should happen when you press the Power button on your machine. By default, these actions are defined in {{ic|/etc/acpi/handler.sh}}, which is executed after any ACPI events are detected (as determined by {{ic|/etc/acpi/events/anything}}).
  
The following is a brief example of one such action. In this case, when the Sleep button is pressed, acpid runs the command {{ic|echo -n mem >/sys/power/state}} which ''should'' place the computer into a sleep (suspend) state:
+
The following is a brief example of one such action. In this case, when the Sleep button is pressed, acpid runs the command {{ic|echo -n mem >/sys/power/state}} which ''should'' place the computer into a sleep (suspend) state:
  
 
  button/sleep)
 
  button/sleep)
Line 39: Line 37:
 
Unfortunately, not every computer labels ACPI events in the same way.  For example, the Sleep button may be identified on one machine as ''SLPB'' and on another as ''SBTN''.  
 
Unfortunately, not every computer labels ACPI events in the same way.  For example, the Sleep button may be identified on one machine as ''SLPB'' and on another as ''SBTN''.  
  
To determine how your buttons or {{Keypress|Fn}} shortcuts are recognized, run the following command from a terminal as root:
+
To determine how your buttons or {{ic|Fn}} shortcuts are recognized, run the following command:
  # tail -f /var/log/messages.log
+
 
 +
  # journalctl -f
 +
 
 +
Now press the Power button and/or Sleep button (e.g. {{ic|Fn+Esc}}) on your machine. The result should look something this:
  
Now press the Power button and/or Sleep button (e.g. {{Keypress|Fn+Esc}}) on your machine.  The result should look something this:
 
 
  logger: ACPI action undefined: PBTN
 
  logger: ACPI action undefined: PBTN
 
  logger: ACPI action undefined: SBTN
 
  logger: ACPI action undefined: SBTN
  
 
If that does not work, run:
 
If that does not work, run:
 +
 
  # acpi_listen
 
  # acpi_listen
 +
 +
or with {{Pkg|openbsd-netcat}}:
 +
 +
$ netcat -U /var/run/acpid.socket
  
 
Then press the power button and you will see something like this:
 
Then press the power button and you will see something like this:
  power/button PBTN 00000000 00000b31
+
 
 +
  button/power PBTN 00000000 00000b31
  
 
The output of {{ic|acpi_listen}} is sent to {{ic|/etc/acpi/handler.sh}} as $1, $2 , $3 & $4 parameters.
 
The output of {{ic|acpi_listen}} is sent to {{ic|/etc/acpi/handler.sh}} as $1, $2 , $3 & $4 parameters.
 
Example:
 
Example:
  $1 power/button
+
 
 +
  $1 button/power
 
  $2 PBTN
 
  $2 PBTN
 
  $3 00000000
 
  $3 00000000
Line 61: Line 68:
 
As you might have noticed, the Sleep button in the sample output is actually recognized as ''SBTN'', rather than the ''SLPB'' label specified in the default {{ic|/etc/acpi/handler.sh}}.  In order for Sleep function to work properly on this machine, we would need to replace ''SLPB)'' with ''SBTN)''.
 
As you might have noticed, the Sleep button in the sample output is actually recognized as ''SBTN'', rather than the ''SLPB'' label specified in the default {{ic|/etc/acpi/handler.sh}}.  In order for Sleep function to work properly on this machine, we would need to replace ''SLPB)'' with ''SBTN)''.
  
Using this information as a base, you can easily customize the {{ic|/etc/acpi/handler.sh}} file to execute a variety of commands depending on which event is triggered.  See the [[Acpid#Tips & Tricks | Tips & Tricks]] section below for other commonly used commands.
+
Using this information as a base, you can easily customize the {{ic|/etc/acpi/handler.sh}} file to execute a variety of commands depending on which event is triggered.  See the [[#Tips and tricks]] section below for other commonly used commands.
  
 
=== Alternative configuration ===
 
=== Alternative configuration ===
  
 
By default, all ACPI events are passed through the {{ic|/etc/acpi/handler.sh}} script. This is due to the ruleset outlined in {{ic|/etc/acpi/events/anything}}:
 
By default, all ACPI events are passed through the {{ic|/etc/acpi/handler.sh}} script. This is due to the ruleset outlined in {{ic|/etc/acpi/events/anything}}:
 +
 
  # Pass all events to our one handler script
 
  # Pass all events to our one handler script
 
  event=.*
 
  event=.*
Line 73: Line 81:
  
 
As root, create the following file:
 
As root, create the following file:
{{hc|/etc/acpi/events/sleep-button|<nowiki>
+
 
 +
{{hc|/etc/acpi/events/sleep-button|2=
 
event=button sleep.*
 
event=button sleep.*
action=/etc/acpi/actions/sleep-button.sh "%e"
+
action=/etc/acpi/actions/sleep-button.sh %e
</nowiki>}}
+
}}
  
 
Now create the following file:
 
Now create the following file:
{{hc|/etc/acpi/actions/sleep-button.sh|<nowiki>
+
 
 +
{{hc|/etc/acpi/actions/sleep-button.sh|2=
 
#!/bin/sh
 
#!/bin/sh
case "$2" in
+
case "$3" in
 
     SLPB) echo -n mem >/sys/power/state ;;
 
     SLPB) echo -n mem >/sys/power/state ;;
     *)    logger "ACPI action undefined: $2" ;;
+
     *)    logger "ACPI action undefined: $3" ;;
 
esac
 
esac
</nowiki>}}
+
}}
  
Finally, make the script executable:  
+
Finally, make the script executable:
 +
 
  # chmod +x /etc/acpi/actions/sleep-button.sh
 
  # chmod +x /etc/acpi/actions/sleep-button.sh
  
 
Using this method, it is easy to create any number of individual event/action scripts.
 
Using this method, it is easy to create any number of individual event/action scripts.
  
==Tips and tricks==
+
== Tips and tricks ==
{{Tip|Some of actions, described here, such as Wi-Fi toggle and backlight control, may already be managed directly by driver. You should consult documentation of corresponding kernel modules, when this is the case.}}
+
  
===Extending acpid with pm-utils===
+
{{Note|Some of actions, described here, such as Wi-Fi toggle and backlight control, may already be managed directly by driver. You should consult documentation of corresponding kernel modules, when this is the case.}}
  
Although {{Pkg|acpid}} can provide basic suspend2ram out-of-the-box, a more robust system may be desired.  [[pm-utils]] provides a very flexible framework for suspend2ram (suspend) and suspend2disk (hibernate) operations, including common fixes for stubborn hardware and drivers (e.g. fglrx module).  pm-utils provides two scripts, {{ic|pm-suspend}} and {{ic|pm-hibernate}}, both of which can be inserted as events into acpid.  For more information, check the [[pm-utils]] wiki.
+
=== Example events ===
 
+
===Example Events===
+
  
 
The following are examples of events that can be used in the {{ic|/etc/acpi/handler.sh}} script. These examples should be modified so that they apply your specific environment e.g. changing the event variable names interpreted by {{ic|acpi_listen}}.
 
The following are examples of events that can be used in the {{ic|/etc/acpi/handler.sh}} script. These examples should be modified so that they apply your specific environment e.g. changing the event variable names interpreted by {{ic|acpi_listen}}.
 
To lock the screen with {{ic|xscreensaver}} when closing the laptop lid:
 
 
button/lid)
 
    case $3 in
 
        close)
 
            # The lock command need to be run as the user who owns the xscreensaver process and not as root.
 
            # See: man xscreensaver-command. $xs will have the value of the user owning the process, if any.
 
 
            xs=$(ps -C xscreensaver -o user=)
 
            if test $xs; then su $xs -c "xscreensaver-command -lock"; fi
 
            ;;
 
 
To suspend the system and lock the screen using {{ic|slimlock}} when the lid is closed:
 
 
button/lid)
 
    case $3 in
 
        close)
 
            #echo "LID switched!">/dev/tty5
 
    /usr/sbin/pm-suspend &
 
    DISPLAY=:0.0 su -c - username /usr/bin/slimlock
 
            ;;
 
 
Execute {{ic|pm-suspend}} when the sleep button is pressed:
 
 
button/sleep)
 
    case "$2" in
 
        SBTN)
 
    #echo -n mem >/sys/power/state
 
            /usr/sbin/pm-suspend
 
            ;;
 
  
 
To set the laptop screen brightness when plugged in power or not (the numbers might need to be adjusted, see {{ic|/sys/class/backlight/acpi_video0/max_brightness}}):
 
To set the laptop screen brightness when plugged in power or not (the numbers might need to be adjusted, see {{ic|/sys/class/backlight/acpi_video0/max_brightness}}):
Line 150: Line 127:
 
=== Enabling volume control ===
 
=== Enabling volume control ===
  
Find out the acpi identity of the volume buttons (see above) and susbtitute it for the acpi events in the files below. We create a script to control the volume (assuming an [[ALSA]] sound card):
+
Find out the acpi identity of the volume buttons (see above) and susbtitute it for the acpi events in the files below.
  
{{hc|/etc/acpi/handlers/vol|<nowiki>
+
{{hc|1=/etc/acpi/events/vol-d|2=
#!/bin/sh
+
event=button/volumedown
step=5
+
action=amixer set Master 5-
 +
}}
  
case $1 in
+
{{hc|1=/etc/acpi/events/vol-m|2=
  -) amixer set Master $step-;;
+
event=button/mute
  +) amixer set Master $step+;;
+
action=amixer set Master toggle
esac
+
}}
</nowiki>}}
+
  
and connect these to new acpi events:
+
{{hc|1=/etc/acpi/events/vol-u|2=
 
+
{{hc|/etc/acpi/events/vol_d|<nowiki>
+
event=button/volumedown
+
action=/etc/acpi/handlers/vol -
+
</nowiki>}}
+
{{hc|/etc/acpi/events/vol_u|<nowiki>
+
 
event=button/volumeup
 
event=button/volumeup
action=/etc/acpi/handlers/vol +
+
action=amixer set Master 5+
</nowiki>}}
+
}}
  
as well as another event to toggle the mute setting:
+
{{Note|These commands may not work as expected with PulseAudio. See [[PulseAudio/Troubleshooting#Output stuck muted while Master is toggled]].}}
 +
{{Tip|Disable or bind the volume buttons in Xorg to prevent conflicts with other applications. See [[Xmodmap]] for details.}}
  
{{hc|/etc/acpi/events/mute|<nowiki>
+
See also [http://blog.lastlog.de/posts/fixing_volume_change_in_linux/ Fixing volume change in Linux].
event=button/mute
+
action=/usr/bin/amixer set Master toggle
+
</nowiki>}}
+
  
 
=== Enabling backlight control ===
 
=== Enabling backlight control ===
Line 184: Line 153:
 
Similar to volume control, acpid also enables you to control screen backlight. To achieve this you write some handler, like this:
 
Similar to volume control, acpid also enables you to control screen backlight. To achieve this you write some handler, like this:
  
{{hc|/etc/acpi/handlers/bl|<nowiki>
+
{{hc|/etc/acpi/handlers/bl|2=
 
#!/bin/sh
 
#!/bin/sh
 
bl_dev=/sys/class/backlight/acpi_video0
 
bl_dev=/sys/class/backlight/acpi_video0
Line 190: Line 159:
  
 
case $1 in
 
case $1 in
   -) echo $((`cat $bl_dev/brightness` - $step)) >$bl_dev/brightness;;
+
   -) echo $(($(< $bl_dev/brightness) - $step)) >$bl_dev/brightness;;
   +) echo $((`cat $bl_dev/brightness` + $step)) >$bl_dev/brightness;;
+
   +) echo $(($(< $bl_dev/brightness) + $step)) >$bl_dev/brightness;;
 
esac
 
esac
</nowiki>}}
+
}}
  
 
and again, connect keys to ACPI events:
 
and again, connect keys to ACPI events:
  
{{hc|/etc/acpi/events/bl_d|<nowiki>
+
{{hc|/etc/acpi/events/bl_d|2=
 
event=video/brightnessdown
 
event=video/brightnessdown
 
action=/etc/acpi/handlers/bl -
 
action=/etc/acpi/handlers/bl -
</nowiki>}}
+
}}
{{hc|/etc/acpi/events/bl_u|<nowiki>
+
{{hc|/etc/acpi/events/bl_u|2=
 
event=video/brightnessup
 
event=video/brightnessup
 
action=/etc/acpi/handlers/bl +
 
action=/etc/acpi/handlers/bl +
</nowiki>}}
+
}}
  
=== Enabling Wi-fi toggle ===
+
=== Enabling Wi-Fi toggle ===
  
 
You can also create a simple wireless-power switch by pressing the WLAN button. Example of event:
 
You can also create a simple wireless-power switch by pressing the WLAN button. Example of event:
  
{{hc|/etc/acpi/events/wlan|<nowiki>
+
{{hc|/etc/acpi/events/wlan|2=
 
event=button/wlan
 
event=button/wlan
 
action=/etc/acpi/handlers/wlan
 
action=/etc/acpi/handlers/wlan
</nowiki>}}
+
}}
  
and its' handler:
+
and its handler:
  
{{hc|/etc/acpi/handlers/wlan|<nowiki>
+
{{hc|/etc/acpi/handlers/wlan|2=
 
#!/bin/sh
 
#!/bin/sh
 
rf=/sys/class/rfkill/rfkill0
 
rf=/sys/class/rfkill/rfkill0
  
case `cat $rf/state` in
+
case $(< $rf/state) in
   0) echo 1 >$rf/state && systemctl start net-auto-wireless;;
+
   0) echo 1 >$rf/state;;
   1) systemctl stop net-auto-wireless && echo 0 >$rf/state;;
+
   1) echo 0 >$rf/state;;
 
esac
 
esac
</nowiki>}}
+
}}
  
=== Laptop Monitor Power Off ===
+
=== Getting user name of the current display ===
  
Adapted from the [http://en.gentoo-wiki.com/wiki/ACPI/Configuration Gentoo Wiki] comes this little gem. Add this to the bottom of {{ic|/etc/acpi/actions/lm_lid.sh}} or to the ''button/lid'' section {{ic|/etc/acpi/handler.sh}}. This will turn off the LCD back-light when the lid is closed, and restart when the lid is opened.
+
To run commands dependening on [[Xorg]], defining the X display as well as the MIT magic cookie file (via XAUTHORITY) is required. Latter is a security credential providing read and write access to the X server, display, and any input devices (see {{ic|man xauth}}).  
case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in
+
    closed) XAUTHORITY=$(ps -C xinit -f --no-header | sed -n 's/.*-auth //; s/ -[^ ].*//; p') xset -display :0 dpms force off ;;
+
    open)  XAUTHORITY=$(ps -C xinit -f --no-header | sed -n 's/.*-auth //; s/ -[^ ].*//; p') xset -display :0 dpms force on  ;;
+
esac
+
  
If you would like to increase/decrease brightness or anything dependent on X, you should specify the X display as well as the MIT magic cookie file (via XAUTHORITY). The last is a security credential providing read and write access to the X server, display, and any input devices.
+
See [https://gist.githubusercontent.com/AladW/de1c5676d93d05a5a0e1/raw/16e010ecda9f2328e1e22d4e02ac814ed27717b4/gistfile1.txt] for an example function when using [[xinitrc]].
  
Here is another script not using XAUTHORITY but sudo:
+
{{Note|
 +
* If the LCD backlight is not turned off when the lid is closed, you may do so manually by running {{ic|getXuser xset dpms force off}} and {{ic|getXuser xset dpms force on}} respectively on lid close and lid open events. Should the display be blanked, but the backlight left on, instead use {{Pkg|vbetool}} with {{ic|vbetool dpms off}} and {{ic|vbetool dpms on}}. See also [[XScreenSaver#Configuration]].
 +
* When using ''who'' or ''w'', make sure {{ic|/run/utmp}} is created at boot-time. See {{ic|man utmp}} for details.
 +
}}
  
case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in
+
==== Connect to acpid socket ====
    closed) sudo -u `ps -o ruser= -C xinit` xset -display :0 dpms force off ;;
+
    open)  sudo -u `ps -o ruser= -C xinit` xset -display :0 dpms force on  ;;
+
esac
+
  
With certain combinations of [[Xorg]] and stubborn hardware, {{ic|xset dpms force off}} only blanks the display leaving the backlight turned on. This can be fixed using {{Pkg|vbetool}} from the [[Official Repositories|official repositories]]. Change the LCD section to:
+
In addition to rule files, acpid accepts connections on a UNIX domain socket, by default {{ic|/var/run/acpid.socket}}. User applications may connect to this socket.
case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in
+
    closed) vbetool dpms off ;;
+
    open)  vbetool dpms on  ;;
+
esac
+
  
If the monitor appears to shut off only briefly before being re-powered, very possibly the power management shipped with xscreensaver conflicts with any manual ''dpms'' settings.
+
{{bc|
 
+
#!/bin/bash
=== Getting user name of the current display ===
+
coproc acpi_listen
You can use the function {{ic|getuser}} to discover the user of the current display:
+
trap 'kill $COPROC_PID' EXIT
getuser ()
+
    {
+
      export DISPLAY=`echo $DISPLAY | cut -c -2`
+
      user=`who | grep " $DISPLAY" | awk '{print $1}' | tail -n1`
+
      export XAUTHORITY=/home/$user/.Xauthority
+
      eval $1=$user
+
    }
+
 
+
This function can be used for example, when you press the power button and want to shutdown [[KDE]] properly:
+
button/power)
+
    case "$2" in
+
        PBTN)
+
            getuser "$user"
+
            echo $user > /dev/tty5
+
            su $user -c "dcop ksmserver ksmserver logout 0 2 0"
+
            ;;
+
          *) logger "ACPI action undefined $2" ;;
+
    esac
+
    ;;
+
  
 +
while read -u ${COPROC[0]} -a event; do
 +
    ''handler.sh'' ${event[@]}
 +
done
 +
}}
  
On newer systems using systemd, X11 logins are no longer necessarily displayed in {{ic|who}}, so the {{ic|getuser}} function above does not work. An alternative is to use {{ic|loginctl}} to obtain the required information, e.g. using [https://github.com/rephorm/xuserrun xuserrun].
+
Where ''handler.sh'' can be a script similar to {{ic|/etc/acpi/handler.sh}}.
  
==See also==
+
== See also ==
  
* http://acpid.sourceforge.net/ - acpid homepage
+
* [http://acpid.sourceforge.net/ acpid homepage]
* http://www.gentoo-wiki.info/ACPI/Configuration - RIP Gentoo wiki entry - New Gentoo Wiki Archives
+
* [http://www.gentoo-wiki.info/ACPI/Configuration Gentoo wiki]
* [[ACPI hotkeys]]
+

Latest revision as of 13:25, 7 August 2016

Related articles

acpid2 is a flexible and extensible daemon for delivering ACPI events. When an event occurs, it executes programs to handle the event. These events are triggered by certain actions, such as:

  • Pressing special keys, including the Power/Sleep/Suspend button
  • Closing a notebook lid
  • (Un)Plugging an AC power adapter from a notebook
  • (Un)Plugging phone jack etc.
Note: Desktop environments, such as GNOME, systemd login manager and some extra key handling daemons may implement own event handling schemes, independent of acpid. Running more than one system at the same time may lead to unexpected behaviour, such as suspending two times in a row after one sleep button press. You should be aware of this and only activate desirable handlers.

Installation

Install the acpid package. Then start and/or enable acpid.service.

Configuration

acpid comes with a number of predefined actions for triggered events, such as what should happen when you press the Power button on your machine. By default, these actions are defined in /etc/acpi/handler.sh, which is executed after any ACPI events are detected (as determined by /etc/acpi/events/anything).

The following is a brief example of one such action. In this case, when the Sleep button is pressed, acpid runs the command echo -n mem >/sys/power/state which should place the computer into a sleep (suspend) state:

button/sleep)
    case "$2" in
        SLPB) echo -n mem >/sys/power/state ;;
	 *)    logger "ACPI action undefined: $2" ;;
    esac
    ;;

Unfortunately, not every computer labels ACPI events in the same way. For example, the Sleep button may be identified on one machine as SLPB and on another as SBTN.

To determine how your buttons or Fn shortcuts are recognized, run the following command:

# journalctl -f

Now press the Power button and/or Sleep button (e.g. Fn+Esc) on your machine. The result should look something this:

logger: ACPI action undefined: PBTN
logger: ACPI action undefined: SBTN

If that does not work, run:

# acpi_listen

or with openbsd-netcat:

$ netcat -U /var/run/acpid.socket

Then press the power button and you will see something like this:

button/power PBTN 00000000 00000b31

The output of acpi_listen is sent to /etc/acpi/handler.sh as $1, $2 , $3 & $4 parameters. Example:

$1 button/power
$2 PBTN
$3 00000000
$4 00000b31

As you might have noticed, the Sleep button in the sample output is actually recognized as SBTN, rather than the SLPB label specified in the default /etc/acpi/handler.sh. In order for Sleep function to work properly on this machine, we would need to replace SLPB) with SBTN).

Using this information as a base, you can easily customize the /etc/acpi/handler.sh file to execute a variety of commands depending on which event is triggered. See the #Tips and tricks section below for other commonly used commands.

Alternative configuration

By default, all ACPI events are passed through the /etc/acpi/handler.sh script. This is due to the ruleset outlined in /etc/acpi/events/anything:

# Pass all events to our one handler script
event=.*
action=/etc/acpi/handler.sh %e

While this works just fine as it is, some users may prefer to define event rules and actions in their own self-contained scripts. The following is an example of how to use an individual event file and corresponding action script:

As root, create the following file:

/etc/acpi/events/sleep-button
event=button sleep.*
action=/etc/acpi/actions/sleep-button.sh %e

Now create the following file:

/etc/acpi/actions/sleep-button.sh
#!/bin/sh
case "$3" in
    SLPB) echo -n mem >/sys/power/state ;;
    *)    logger "ACPI action undefined: $3" ;;
esac

Finally, make the script executable:

# chmod +x /etc/acpi/actions/sleep-button.sh

Using this method, it is easy to create any number of individual event/action scripts.

Tips and tricks

Note: Some of actions, described here, such as Wi-Fi toggle and backlight control, may already be managed directly by driver. You should consult documentation of corresponding kernel modules, when this is the case.

Example events

The following are examples of events that can be used in the /etc/acpi/handler.sh script. These examples should be modified so that they apply your specific environment e.g. changing the event variable names interpreted by acpi_listen.

To set the laptop screen brightness when plugged in power or not (the numbers might need to be adjusted, see /sys/class/backlight/acpi_video0/max_brightness):

ac_adapter)
    case "$2" in
        AC*|AD*)
            case "$4" in
                00000000)
                    echo -n 50 > /sys/class/backlight/acpi_video0/brightness
                    ;;
                00000001)
                    echo -n 100 > /sys/class/backlight/acpi_video0/brightness
                    ;;
            esac

Enabling volume control

Find out the acpi identity of the volume buttons (see above) and susbtitute it for the acpi events in the files below.

/etc/acpi/events/vol-d
event=button/volumedown
action=amixer set Master 5-
/etc/acpi/events/vol-m
event=button/mute
action=amixer set Master toggle
/etc/acpi/events/vol-u
event=button/volumeup
action=amixer set Master 5+
Note: These commands may not work as expected with PulseAudio. See PulseAudio/Troubleshooting#Output stuck muted while Master is toggled.
Tip: Disable or bind the volume buttons in Xorg to prevent conflicts with other applications. See Xmodmap for details.

See also Fixing volume change in Linux.

Enabling backlight control

Similar to volume control, acpid also enables you to control screen backlight. To achieve this you write some handler, like this:

/etc/acpi/handlers/bl
#!/bin/sh
bl_dev=/sys/class/backlight/acpi_video0
step=1

case $1 in
  -) echo $(($(< $bl_dev/brightness) - $step)) >$bl_dev/brightness;;
  +) echo $(($(< $bl_dev/brightness) + $step)) >$bl_dev/brightness;;
esac

and again, connect keys to ACPI events:

/etc/acpi/events/bl_d
event=video/brightnessdown
action=/etc/acpi/handlers/bl -
/etc/acpi/events/bl_u
event=video/brightnessup
action=/etc/acpi/handlers/bl +

Enabling Wi-Fi toggle

You can also create a simple wireless-power switch by pressing the WLAN button. Example of event:

/etc/acpi/events/wlan
event=button/wlan
action=/etc/acpi/handlers/wlan

and its handler:

/etc/acpi/handlers/wlan
#!/bin/sh
rf=/sys/class/rfkill/rfkill0

case $(< $rf/state) in
  0) echo 1 >$rf/state;;
  1) echo 0 >$rf/state;;
esac

Getting user name of the current display

To run commands dependening on Xorg, defining the X display as well as the MIT magic cookie file (via XAUTHORITY) is required. Latter is a security credential providing read and write access to the X server, display, and any input devices (see man xauth).

See [1] for an example function when using xinitrc.

Note:
  • If the LCD backlight is not turned off when the lid is closed, you may do so manually by running getXuser xset dpms force off and getXuser xset dpms force on respectively on lid close and lid open events. Should the display be blanked, but the backlight left on, instead use vbetool with vbetool dpms off and vbetool dpms on. See also XScreenSaver#Configuration.
  • When using who or w, make sure /run/utmp is created at boot-time. See man utmp for details.

Connect to acpid socket

In addition to rule files, acpid accepts connections on a UNIX domain socket, by default /var/run/acpid.socket. User applications may connect to this socket.

#!/bin/bash
coproc acpi_listen
trap 'kill $COPROC_PID' EXIT

while read -u ${COPROC[0]} -a event; do
    handler.sh ${event[@]}
done

Where handler.sh can be a script similar to /etc/acpi/handler.sh.

See also