<br><div class="gmail_quote"><div dir="ltr">On Mon, Jul 16, 2018, 21:33 John Ioannidis <<a href="mailto:systemd-devel@tla.org">systemd-devel@tla.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr" style="font-size:12.8px;text-decoration-style:initial;text-decoration-color:initial">Assume I have a one-shot service,<span> </span><b>phase1.service</b>, which runs for a while and then terminates. I want to have a<span> </span><b>phase2.service</b> start up when phase1 terminates. <div><br></div><div>I cannot change anything in phase1.service's systemd files or code or anything, or I would not be asking this question!</div></div></div></blockquote></div><div><br></div><div>Sure you can – systemd has several ways of extending a unit file without touching the (read-only) original, such as "<unit>.d/*.conf" drop-ins or "<unit>.wants/" symlinks.</div><div><br></div><div>And in the end those are the only direct answer to your question. If phase1.service needs to trigger phase2.service, the former must have a dependency (Requires= or Wants=) on the latter. Anything else would be either a workaround or a hack.</div><div><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr" style="font-size:12.8px;text-decoration-style:initial;text-decoration-color:initial"><div><br></div><div>A dirty workaround is to just have phase2 start before phase1 and run this script (wait until phase1 starts up, then wait until it finishes, then do its thing):</div></div></div></blockquote></div><div><br></div><div>Type=oneshot services are "starting" the entire time the main process is running, moving to active or inactive only when the process *exits*.</div><div><br></div><div>As far as I know, they don't have separate "starts up" and "finishes" phases, so your description of phase1.service's behavior contradicts itself. Please clarify this.</div><div><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr" style="font-size:12.8px;text-decoration-style:initial;text-decoration-color:initial"><div><br></div><div><font face="monospace, monospace" size="1">    while ! systemctl status phase1.service > /dev/null</font></div><div><font face="monospace, monospace" size="1">    do</font></div><div><font face="monospace, monospace" size="1">      sleep 10 # still waiting for phase1 to start up</font></div><div><font face="monospace, monospace" size="1">    done</font></div><div><div style="text-decoration-style:initial;text-decoration-color:initial"><font face="monospace, monospace" size="1">    while systemctl status phase1.service > /dev/null</font></div><div style="text-decoration-style:initial;text-decoration-color:initial"><font face="monospace, monospace" size="1">    do</font></div><div style="text-decoration-style:initial;text-decoration-color:initial"><font face="monospace, monospace" size="1">      sleep 10 # still waiting for phase1 to finish</font></div><div style="text-decoration-style:initial;text-decoration-color:initial"><font face="monospace, monospace" size="1">    done</font></div><font face="monospace, monospace" size="1">    # now do the phase2 work</font></div><div><br></div><div>There has to be a better way of doing this, but I can't figure it out. Google/Bing/SO searches return lots of other workarounds, mostly for user sessions, which is not the case here.</div></div></div></blockquote></div><div><br></div><div>If phase1.service is truly Type=oneshot, then extending it as follows should work fine.</div><div><br></div><div>    # /etc/systemd/system/phase1.service.d/depend-on-phase2.conf</div><div>    [Unit]</div><div>    Wants=phase2.service</div><div>    Before=phase2.service</div><div><br></div><div>If it's not Type=oneshot... sure sounds like it was meant to be.</div><div><br></div><div>Unfortunately for all other types (which have a distinct 'stopping' stage) there's no straightforward answer, although there still are plenty of better options than "while(sleep 10)".</div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><p dir="ltr">Mantas Mikulėnas</p>
</div>