14

Question: How to assign a script to run when selecting the suspend option on the power menu?

Context:
I have a Sony VAIO laptop with an AMD Radeon graphics card. I would like to be able to disable/enable the discrete graphics card. I have no problem in doing this but it causes problems when suspending & resuming from suspend.

When the session is resumed from suspend (with the discrete DPU disabled), the fan will spin up uncontrollably, what I would like to do is edit the suspend script or assign a new script to the suspend option on the power menu. This is so I can re-enable the GPU before suspending. Power Menu

EDIT: After some research I think it has something to do with the files in /etc/pm/sleep.d/?

If I put a custom script in there would it be run when suspending and resuming from suspend?

How do I differentiate in the script between suspending/resuming?

0

2 Answers 2

18

You are right. You have to write a script and save it to /lib/systemd/system-sleep/ (since 2015 systemd take care of that, before was /etc/pm/sleep.d/). The difference between suspending and resuming is given as a parameter to the script:

#!/bin/bash

case "$1" in
    suspend)
        # executed on suspend
        ;;
    resume) 
        # executed on resume
        ;;
    *)
        ;;
esac

If you also want to do it for hibernate, the arguments would be hibernate and thaw.

6
  • I'd seen this in other scripts and was wondering on the specific requirements for such a script. Thank you :) Feb 25, 2013 at 13:38
  • Hi, tried this on my Dell 5570 running ubuntu 14.04 to get it to turn my touchpad on, if I'd turned if off before suspending. for some reason, the command tp_id= ()xinput list | grep -i touchpad | awk '{ print $7 }' | sed 's/id=//'() is not returning the id, while this command does work from the command line. Can you see any reason why it wouldn't? For other purposes you script works great. Thanks!
    – Leo Simon
    Mar 11, 2016 at 0:16
  • Sorry, in that previous comment, I tried to put backticks into the script fragment, but the minimarkdown language defeated me. the ()'s are meant to be replaced by backticks
    – Leo Simon
    Mar 11, 2016 at 0:27
  • @LeoSimon Hey Leo, the comments are not the right place to discuss such a follow up question. I suggest you ask an entirely new question. This way a lot more people will see it and be able to help you :-) Mar 11, 2016 at 8:55
  • 3
    You may need to use /lib/systemd/system-sleep/ instead.
    – SimonT
    Oct 20, 2017 at 5:17
2

On current Ubuntu versions which use systemd, you can put scripts (or links to scripts) into /lib/systemd/system-sleep/.

Try to put this into /usr/local/bin/test-sleep.sh :

#!/bin/sh

## This file (or a link to it) must be in /lib/systemd/system-sleep/

me=$(basename "$0")

case "$1" in
    pre)
        logger -t "$me" "Suspending: \$1=$1, \$2=$2" ;;
    post)
        logger -t "$me" "Resuming: \$1=$1, \$2=$2" ;;
esac

Then make it executable and put a link to it for systemd:

sudo chmod +x /usr/local/bin/test-sleep.sh
sudo ln -si /usr/local/bin/test-sleep.sh  /lib/systemd/system-sleep/

The script just writes to syslog, so you can see what it did with

grep 'test-sleep' /var/log/syslog

You must log in to answer this question.

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