[systemd-devel] Help writing a user service file that will exec a command upon system sleep

Richard Maw richard.maw at codethink.co.uk
Mon Nov 2 05:34:11 PST 2015


On Mon, Nov 02, 2015 at 09:04:31AM +0100, Lennart Poettering wrote:
> On Wed, 28.10.15 19:30, John (da_audiophile at yahoo.com) wrote:
> 
> > I have a simple bash script that I would like to have a user service
> > file run with an argument when the system enters a sleep or
> > hibernation state but as I understand it, user service units do not
> > use the sleep.target.  The goal is to have the following run before
> > the system goes into sleep/hibernate triggered by whatever mechanism
> > systemd uses to detect when the user sleeps or hibernates the
> > system: '/usr/bin/psd sync'
> 
> You can install a suspend delay inhibitor:
> 
> https://wiki.freedesktop.org/www/Software/systemd/inhibit/
> 
> That works from privileged code the same as for user code. However,
> you cannot really do that from shell code. I fear for shell this is
> simply not available, sorry.

You may be able to abuse the hell out of systemd-inhibit to have it work:

#!/bin/sh
# Approach cribbed from http://www.opopop.net/Harnessing_DBus/
while true; do
    # Hold inhibitor lock until dbus signal that preparing to sleep
    systemd-inhibit --what=sleep --why="sync psd" sh -c '
        dbus-monitor --system "interface='org.freedesktop.login1.Manager',member='PrepareForSleep'" |
        while read -r line; do
            read type value
            if [ "$type" = boolean -a "$value" = true ]; then
                break
            fi
        done
        /usr/bin/psd sync
    '
    # Wait for a message saying we're resuming before restarting monitor
    dbus-monitor --system "interface='org.freedesktop.login1.Manager',member='PrepareForSleep'" |
    while read -r line; do
        read type value
        if [ "$type" = boolean -a "$value" = false ]; then
            break
        fi
    done
done        

Though I wouldn't honestly recommend doing it this way.


More information about the systemd-devel mailing list