[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