[systemd-devel] Starting one service when another one starts
Andrei Borzenkov
arvidjaar at gmail.com
Sat Apr 9 05:17:03 UTC 2022
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