[systemd-devel] Ordering of oneshot services and path units?

John Ioannidis systemd-devel at tla.org
Sat Mar 27 07:11:38 UTC 2021


tl;dr: a .path unit does not appear to be waiting for the After= unit to
run first.

I am still trying to understand why some services occasionally do not start
at boot time. It is a very intermittent behavior, but I caught another
instance. Everything is running in Google Compute Engine or Amazon EC2.

I have a one-shot service, *mktags.service*, a long-running job of type
*notify*, *ccistated.service*, and a path unit with its corresponding
service, *workdir.path* and *workdir.service*. Here are the relevant parts
of the unit files:


*mktags.service*

[Unit]
Description=Populate /run/metadata/tags
After=network.target
[Service]
ExecStart=/usr/local/sbin/mktags.py
Type=oneshot
[Install]
WantedBy=multi-user.target



*ccistated.service*

[Unit]
Description=State Machine Manager
After=mktags.service
ConditionPathExists=/run/metadata/tags/resource_class
[Service]
ExecStart=/usr/local/sbin/ccistated.py
Type=notify
NotifyAccess=all
[Install]
WantedBy = multi-user.target



*workdir.path *

[Unit]
Description=Trigger workdir.service when a job starts, creating a directory
in /opt/circleci/workdir
After=ccistated.service
ConditionPathExists=/run/metadata/tags/resource_class
[Path]
PathChanged=/opt/circleci/workdir
[Install]
WantedBy=multi-user.target


What *mktags* does is extract the metadata tags from the metadata service,
and populate /run/metadata/tags/.

$ systemctl status mktags.service
* mktags.service - Populate /run/metadata/tags
    Loaded: loaded (/etc/systemd/system/mktags.service; enabled; vendor
preset: enabled)
    Active: inactive (dead) since Sat 2021-03-27 05:34:00 UTC; 10min ago
   Process: 454 ExecStart=/usr/local/sbin/mktags.py (code=exited,
status=0/SUCCESS)
  Main PID: 454 (code=exited, status=0/SUCCESS)

Sure enough, it ran:

$ cat /run/metadata/tags/resource_class
waw

As did the next service:

$ systemctl status ccistated.service
* ccistated.service - State Machine Manager
    Loaded: loaded (/etc/systemd/system/ccistated.service; enabled; vendor
preset: enabled)
    Active: active (running) since Sat 2021-03-27 05:36:00 UTC; 8min ago
  Main PID: 1420 (python3)
     Tasks: 1 (limit: 9544)
    Memory: 8.5M
    CGroup: /system.slice/ccistated.service
            `-1420 python3 /usr/local/sbin/ccistated.py

It's OK that it took a couple of minutes for ccistated to start up, it does
a few things before sending out the Notify.

But look at the old workdir.path:

$ systemctl status workdir.path
* workdir.path - Trigger workdir.service when a job starts, creating a
directory in /opt/circleci/workdir
    Loaded: loaded (/etc/systemd/system/workdir.path; enabled; vendor
preset: enabled)
    Active: inactive (dead)
  Triggers: * workdir.service
 Condition: start condition failed at Sat 2021-03-27 05:33:59 UTC; 22min
ago
            `- ConditionPathExists=/run/metadata/tags/resource_class was
not met

Huh?!?!?! It's supposed to run after ccistated, and of course after mktags
(highlighted in cyan above). It appears to be running anyway, and of course
mktags has not gotten a chance to finish, and the ConditionExists file has
not been created yet.

Do .path units not obey the same startup rules?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/systemd-devel/attachments/20210327/92089f01/attachment.htm>


More information about the systemd-devel mailing list