[systemd-devel] Starting one service when another one starts

Kevin P. Fleming kevin at km6g.us
Sat Apr 9 12:10:09 UTC 2022


This sort of behavior has been a long-standing desire of many systemd
users, and you can find probably thousands of blog/forum/SO posts
about it. As Andrei said, the names of the dependencies in systemd
units might appear to be the behavior you want, but they aren't.

If you have a situation where service B must always be running when
service A is running, and never when service A is not running, a
combination of "Upholds" and "PropagatesStopTo" will do that, although
you'll need very recent systemd to have these available.

On Sat, Apr 9, 2022 at 1:17 AM Andrei Borzenkov <arvidjaar at gmail.com> wrote:
>
> On 08.04.2022 23:35, Nick Howitt wrote:
> > Sorry, for the delay. Big internet outage.
> >
> > On 08/04/2022 15:15, Andrei Borzenkov wrote:
> >>
> >> On 08.04.2022 14:54, Nick Howitt wrote:
> >>> Hi,
> >>> I apologise if this is not the right place for user help. If it is not,
> >>> please point me to the best place.
> >>>
> >>> I am trying to start a service (clearshare-scheduler) when another
> >>> service (siad) starts. Clearshare-scheduler is an odd service. When you
> >>> start it it may run for ages (days+) or it may terminate immediately so
> >>> I have set it up as a oneshot:
> >>>
> > clearshare-scheduler.service
> >>> [Unit]
> >>> Description=Clearshare Scheduler
> >>> PartOf=siad.service
> >>> After=siad.service
> >>>
> >>> [Service]
> >>> Type=oneshot
> >>> Environment="TERM=dumb"
> >>> ExecStartPre=-/usr/bin/killall -15 -q /usr/sbin/clearshare-scheduler.sh
> >>> ExecStartPre=-/usr/bin/echo "$(/usr/bin/date) Starting scheduler from
> >>> systemd" >> /var/log/scheduler.log
> >>> ExecStart=/usr/sbin/clearshare-scheduler.sh > /dev/null
> >>> ExecStop=-/usr/bin/killall -15 -q /usr/sbin/clearshare-scheduler.sh
> >>>
> >>> [Install]
> >>> WantedBy=multi-user.target
> >>>
> >>> The siad service looks like:
> >>>
> > siad.service
> >>> [Unit]
> >>> Description=Siad
> >>> After=syslog.target network.target clearsync.service
> >>>
> >>> [Service]
> >>> Type=simple
> >>> OOMScoreAdjust=500
> >>> PIDFile=/var/run/siad.pid
> >>> EnvironmentFile=/etc/sysconfig/siad
> >>> Environment="SIA_DATA_DIR=/var/lib/siad-data"
> >>> ExecStartPre=-/usr/bin/killall -15 -q clearshare-scheduler.sh
> >>> ExecStartPre=-/usr/bin/rm -f /var/run/siad.pid
> >>> ExecStart=/usr/bin/siad $EXTRA_ARGS
> >>> ExecStop=/usr/bin/siac stop
> >>> WorkingDirectory=/var/lib/sia/
> >>> ExecStartPost=/usr/bin/sh -c 'umask 022; /usr/bin/pgrep siad >
> >>> /var/run/siad.pid'
> >>>
> >>> [Install]
> >>> WantedBy=multi-user.target
> >>>
> >>
> >> You do not show actual unit names which makes it rather difficult to follow.
> > Done. See above
> >>
> >>> A "systemctl show clearshare-scheduler" lists the PartOf=siad.service as
> >>> one of its properties but, in reverse, "systemctl show siad" does not
> >>> list the corresponding ConsistsOf property.
> >>>
> >>> When I start siad, nothing happens to the clearshare-scheduler service.
> >>
> >> Why do you expect to happen? There is no Wants or Requires in the unit
> >> that is /probably/ siad.service so request to start siad.service will
> >> not pull in any additional units.
> > Perhaps I have misunderstood, but from the documentation I understood
> > you could PartOf in force (in this case) clearshare-scheduler.service to
> > respond when siad.service was stopped or started. Have I misunderstood
> > the docs? I am hoping to not do any changes to the siad.service.
> >
>
> Documentation for PartOf says "limited to stopping and restarting of
> units". Nothing about "starting". PartOf complements normal startup
> dependencies, not replaces them. And yes, this is confusing, as are the
> names of almost any systemd dependency which mean something entirely
> different from what these names imply in English.
>
> You can add WantedBy=siad.service to [Install] section of
> clearshare-scheduler.service. In general you can always extend Wants by
> manually creating necessary links. This does not require you to edit
> unit definition itself. You can also create drop-in (although I am not
> sure whether they are already supported in your systemd version).
>
> > As an alternative, which does affect the siad.service, is there any way
> > I can run the clearshare-scheduler.sh script from the siad.service? I
> > have tried starting it as a ExecStartPost, but it does not appear to
> > work if the script does not exit immediately. If it runs for a while,
> > then systemd says siad has failed to start.
>
> You can increase TimeoutStartSec.
>
> > I've tried launching it with
> > ExecStartPost=-/usr/sbin/clearshare-scheduler.sh
>
> "-" affects command that completed with failure status, in your case
> command does not complete so this does not have any effect.
>
> > and
> > ExecStartPost=-/usr/sbin/clearshare-scheduler.sh &
> > and
> > ExecStartPost=-/usr/bin/nohup /usr/sbin/clearshare-scheduler.sh &
> >
>
> sytsemd is not shell, what made you think this would work? If you want
> to use shell syntax, you need to invoke shell
>
> /bin/sh -c "/usr/sbin/clearshare-scheduler.sh &"
>
> >>
> >>> It does not try to start but it runs when I run it on its own. Have I
> >>> misunderstood something?
> >>>
> >>> My version of systems is systemd-219-78.el7_9.5.
> >>>
> >>> Thanks,
> >>>
> >>> Nick
> >>
>


More information about the systemd-devel mailing list