<div dir="ltr"><span style="font-family:arial,sans-serif;font-size:13px">I have the following problem:</span><div style="font-family:arial,sans-serif;font-size:13px">There are 3 (or more) systemd targets. Each of the three targets starts a number of systemd services.</div>
<div style="font-family:arial,sans-serif;font-size:13px">It can be switched back and forth between the systemd targets.<br clear="all"><div><br></div><div>As a limitation, it is necessary that the services of a target start only if the services of actual target are already stopped. Because there have resources to be released, such as a serial port.</div>
<div><br></div><div>The problem is solved with Unit paramter Conflicts. Starting a target will stop the other. </div><div><br></div><div>The following systemd units demonstrate the problem.</div><div>3 systemd targets, 3 services and a dummy-program</div>
<div>================================</div><div><div>mode-1.target </div><div>--------------------</div><div>[Unit]</div><div>Description=mode 1</div><div><br></div><div>Conflicts=mode-2.target</div><div>Conflicts=mode-3.target</div>
<div><br></div><div>[Install]</div><div>WantedBy=multi-user.target</div></div><div><div>================================</div><div></div></div><div><div>mode-2.target </div><div>--------------------</div><div>[Unit]</div>
<div>Description=mode 2</div><div><br></div><div>Conflicts=mode-1.target</div><div>Conflicts=mode-3.target</div><div><br></div><div>After=mode-1.target</div><div><br></div><div>[Install]<br></div><div>WantedBy=multi-user.target</div>
</div><div><div>================================</div><div><div>mode-3.target </div><div>--------------------</div><div>[Unit]</div><div>Description=mode 3</div><div><br></div><div>Conflicts=mode-1.target</div><div>Conflicts=mode-2.target</div>
<div><br></div><div><div>After=mode-1.target</div><div>After=mode-2.target</div><div><br></div></div><div>[Install]<br></div><div>WantedBy=multi-user.target</div></div><div><div>================================</div><div>
<div>unit-a-resource-1.service </div><div>-----------------------------------</div><div>[Unit]</div><div>Description=Unit A use resource 1</div><div><br></div><div>After=mode-1.target</div><div><br></div><div>Conflicts=mode-2.target</div>
<div>Conflicts=mode-3.target</div><div><br></div><div>[Service]</div><div>ExecStart=/usr/bin/dummy_unit.sh "Unit A use resource 1"</div><div>TimeoutSec=10</div><div><br></div><div>[Install]</div><div>WantedBy=mode-1.target</div>
</div><div><div>================================</div><div><div>unit-b-resource-1.service </div><div>-----------------------------------</div><div>[Unit]</div><div>Description=Unit B use resource 1</div><div><br></div><div>
After=mode-2.target</div><div><br></div><div>Conflicts=mode-1.target</div><div>Conflicts=mode-3.target</div><div><br></div><div>[Service]</div><div>ExecStart=/usr/bin/dummy_unit.sh "Unit B use resource 1"</div><div>
<br></div><div><br></div><div>[Install]</div><div>WantedBy=mode-2.target</div></div><div><div>================================</div><div><div>unit-c-resource-2.service </div><div>------------------------------------</div>
<div>[Unit]</div><div>Description=Unit C use resource 2</div><div><br></div><div>After=mode-3.target</div><div><br></div><div>Conflicts=mode-1.target</div><div>Conflicts=mode-2.target</div><div><br></div><div>[Service]<br>
</div><div>ExecStart=/usr/bin/dummy_unit.sh "Unit C use resource 2"</div><div><br></div><div><br></div><div>[Install]</div><div>WantedBy=mode-3.target</div></div><div><div>================================</div><div>
<div>dummy_unit.sh</div><div>---------------------- </div><div>#!/bin/bash</div><div><br></div><div>running=true</div><div>trap 'echo got signal TERMinated; running=false' TERM</div><div><br></div><div>echo "$1"</div>
<div><br></div><div># do something</div><div>while $running</div><div>do</div><div>        sleep 1</div><div>done</div><div><br></div><div># simulate longer shutdown</div><div>sleep 1</div><div>sleep 1</div><div>sleep 1</div>
<div>sleep 1</div><div>sleep 1</div><div><br></div><div>echo "$1 done"</div><div><div>================================</div><div>#####################################</div><div><br></div><div>Switch from mode-2.target to mode-1.target<br>
</div></div><div>systemctl start mode-1.target</div><div><br></div><div><div>systemd[1]: Stopping Unit B use resource 1...</div><div>dummy_unit.sh[3303]: Terminated</div><div>dummy_unit.sh[3303]: got signal TERMinated</div>
<div>dummy_unit.sh[3303]: Terminated</div><div>systemd[1]: Stopped Unit B use resource 1.<br></div><div>dummy_unit.sh[3303]: Unit B use resource 1 done</div><div>systemd[1]: Stopping mode 2.</div><div>systemd[1]: Stopped target mode 2.</div>
<div>systemd[1]: Starting mode 1.</div><div>systemd[1]: Reached target mode 1.</div><div>systemd[1]: Starting Unit A use resource 1...</div><div>systemd[1]: Started Unit A use resource 1.</div><div>dummy_unit.sh[3322]: Unit A use resource 1</div>
</div><div><br></div><div>systemd service service unit-b-resource-1.service is stopped an than service unit-a-resource-1.service starts.</div><div><br></div><div>This all works only if the line </div><div><br></div><div>After=mode-1.target</div>
<div><br></div><div>exist in mode-2.target and the lines </div><div><br></div><div>After=mode-1.target</div><div>After=mode-2.target</div><div><br></div><div>exists in mode-3.target.</div><div>=======================================<br>
</div><div>Without these lines, it looks like this:</div><div><br></div><div><div>Switch from mode-2.target to mode-1.target</div><div>systemctl start mode-1.target</div></div><div><br></div><div><div><div>systemd[1]: Stopping Unit B use resource 1...</div>
<div>dummy_unit.sh[1009]: Terminated</div><div>dummy_unit.sh[1009]: got signal TERMinated</div><div>systemd[1]: Starting mode 1.</div><div>systemd[1]: Reached target mode 1.</div><div>systemd[1]: Starting Unit A use resource 1...</div>
<div>dummy_unit.sh[1009]: Terminated</div><div>systemd[1]: Started Unit A use resource 1.</div><div>dummy_unit.sh[2873]: Unit A use resource 1</div><div>dummy_unit.sh[1009]: Unit B use resource 1 done<br></div><div>systemd[1]: Stopped Unit B use resource 1.</div>
<div>systemd[1]: Stopping mode 2.</div><div>systemd[1]: Stopped target mode 2.</div></div><div><br></div><div>systemd service unit-a-resource-1.service starts before the other service unit-b-resource-1.service is stopped.</div>
</div><div><br></div><div>Can anyone explain this behavior? (The parameter "After=" in mode-2.target and mode-3.target but not in mode-1.target)</div><div>Can someone give a hint or a reference to the appropriate documentation?<br>
</div><div>Or is this all working by change? I use systemd version 211.</div><div>Is there a better solution?<br></div><div><br></div><div>I hope I could describe the problem understandable.</div><div><br></div><div>Regards,</div>
<div><br></div><div>Mario</div></div></div></div></div></div></div></div><div><br></div>
</div>