[systemd-devel] mount-on-demand for backups; hooks for indicating success/failure

Michal Sekletar msekleta at redhat.com
Fri Mar 10 09:26:07 UTC 2017


On Thu, Mar 9, 2017 at 4:53 PM, Jonathan Dowland
<jon+systemd-devel at alcopop.org> wrote:
> Hey,
>
> I have some backup services which depend on mounts. I want those
> filesystems unmounted when the backup jobs are not running. This is
> easily achieved with StopWhenUnneeded.
>
> I also want to trigger the backup jobs to start when I attach my
> external HDD. This is reasonably simple by adding WantedBy=<device>
> to the backup service (*not* the mount unit, or it will never be
> auto-unmounted).

WantedBy=device sounds like a weird hack to me. I think that it would
be better to use SYSTEM_WANTS in udev rules instead.

>
> So far so good!
>
> However, this is a headless box and I want to blink an LED when certain
> jobs are running, finish or fail. So I need to execute commands in
> certain situations. Job failure is easy, I can use OnFailure= and set up
> a oneshot service. Job started isn't too bad, I add a ExecStart=-
> to my backup service before the real one.

OnFailure is fine and ExecStart before starting backup also sounds reasonable.

>
> Signalling "device is safe to remove" I have not figured out.
> Using a chain of blah.device -> blah.mount -> backup-blah.service units,
> "safe to remove" LED should only happen after the mount has completed
> unmounting, successfully. Is there an existing "hook" or place that I
> could put that in this situation?

It should be possible to achieve this with normal dependencies. For
example, you would have blink-successful.service that would Require
backup service and would be ordered after it.

Dependencies should then look like this,
# backup.service
[Unit]
Wants=blink-successful.service

# blink-successful.service,
[Unit]
Requires=backup.service
After=backup.service

backup.service pulls in blink service and that will run only when
backup succeeded.

>
> My temporary solution is to remove the mount unit entirely, define the
> mount point in /etc/fstab and use ExecStart and ExecStop in the backup
> service to mount and umount before and after the job runs:
>
>     [Unit]
>     OnFailure=blinkstick-fail.service
>     [Service]
>     ExecStart=/bin/mount /media/ipod

I'd leave fstab entry in place and replace ExecStart=/bin/mount with
RequiresMountsFor=/media/ipod (this belongs to [Unit] section). So
when this service is started it will pull in mount unit to transaction
and gets ordered after the mount unit.

Michal


More information about the systemd-devel mailing list