For some reason, my laptop's screen brightness does not update when I plug-in or plug-out the power supply. I've looked at quite a few solutions for that problem, but none of them seemed to work well. So, instead of despairing and giving up, I decided to try to turn this into a learning experience and see if I can't write a script that does it for me.

I tried figuring it out on my own, with some help from the internet, of course, but I'm pretty new to bash scripting and Ubuntu in general, so I didn't get far.

What I was able to figure out was that I can find the state of the battery with

$ upower -i /org/freedesktop/UPower/devices/battery_BAT1 | grep -E "state"
state:     charging/discharging

depending on whether or not the AC adapter is plugged in. I don't know if that's even useful, but it's kinda cool, and I didn't know how to use grep before, so what the hell, learning is fun.

Anyways, is there a somewhat clean way to do this? By "clean way" I just mean a way that one with limited bash script experience could comprehend.

One similar question I found that had a good answer is this one, which says the following:

When you plug in/out the AC adapter, the scripts in /etc/pm/power.d get called with >an argument: "true" (if you run on battery), or "false" (if you run with the power >adapter).

The problem is that I don't know how to access that argument from within a script. So, I guess it all boils down to a pretty simple problem, but I thought I'd post the question anyways, in case people had better solutions.

1 Answer 1


You can use on_ac_power to run a script when the power supply is turned on or off.

Try the following in a terminal.

$ on_ac_power
$ echo $?
0              ## Laptop on ac power

$ on_ac_power
$ echo $?
1              ## Laptop on battery (not on ac power)

Based on this you can make your script as,

while true
    if on_ac_power; then 
        do_something               ## Laptop on power
        do_something_else          ## Laptop on battery
    sleep 10                       ## wait 10 sec before repeating


cron job would be a better idea for running the script at a regular interval instead of using an infinite loop.

Save your script as myscript.sh and put the following content in it,

if on_ac_power; then 

Make the script executable from a terminal, chmod +x /path/to/myscript.sh. Open your personal crontab as EDITOR=gedit crontab -e and append the following line in it to run your script every minute.

* * * * * /path/to/myscript.sh 
  • Is it bad practice, to have scripts running infinitely, or is that something that happens regularly and is built in to the system? I guess I was looking for some sort of trigger but if this works, then it's much less complicated than I had assumed.
    – Jasper
    Feb 27, 2015 at 17:39
  • @TheQZ: I think 'souravc' has given the basic idea..you can write your own based on this :)
    – heemayl
    Feb 27, 2015 at 17:44
  • @TheQZ Though it runs forever but becomes active only once per 10 sec (you can increase the check time) Look at the question how to repeat-a-command-every-x-interval-of-time. Otherwise you need to write your own daemon program which is much complicated for the beginners.
    – sourav c.
    Feb 27, 2015 at 17:51
  • Great! Thanks! Looks like that's what I needed.
    – Jasper
    Feb 27, 2015 at 17:59
  • 2
    A better way is to use udev rule as in askubuntu.com/questions/613741/…. May 10, 2016 at 9:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.