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


Reply via email to