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

Nick Howitt nick at howitts.co.uk
Mon Apr 11 11:41:00 UTC 2022



On 09/04/2022 06:17, Andrei Borzenkov 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).
> 

I've tried this and can implement what you've described, but as you say, 
it does not help me when starting the WantedBy service (siad).

>> 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 &"
> 

Using bash rather than sh:
/bin/bash -c '/usr/sbin/clearshare-scheduler.sh &'

This is not producing the results expected. It does not go into the 
background with the '&' and does not even appear to run. I have 
simplified the clearshare-scheduler.sh script to just:

#!/bin/bash
/usr/bin/sleep 10
/usr/bin/echo hello >> /var/log/scheduler.log

If I do this the service start fails and times out. At the same time a 
"ps aux | grep scheduler" never shows the script running and "hello" is 
not output to /var/log/scheduler.log

If I remove the '&', clearshare-scheduler.sh runs and outputs to file, 
but it is no good if the scheduler script does not terminate for a long 
time as the service fails when the unit file times out.

I think I am stuck here.

>>>
>>>> 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