Also... ich hab jetzt ein Testszenario aufgebaut.
Dieses Service stoppt über Conflicts=%i das Service %i (also z.B. my-service.service), führt einen Dump aus (ExecStart=...) und startet über eine Abhängigkeit nach dem Ende von ExecStart=.... einen Timer, der den ursprünglichen Service wieder startet.
Code: Alles auswählen
# cat my-dump@.service
[Unit]
Wants=my-restart@%i.timer
Before=my-restart@%i.timer
Conflicts=%i
After=%i
[Service]
Type=oneshot
ExecStart=/usr/local/bin/my-dump.sh
Der Timer, der im my-dump@%i.service gestartet wird, Dieser Timer startet lediglich ein Target, das als Abhängigkeit wieder den Server hat.
Code: Alles auswählen
# cat my-restart@.timer
[Unit]
[Timer]
OnActiveSec=1s
Unit=my-restart@%i.target
RemainAfterElapse=no
Das Target, das vom Timer gestartet wird. Es beendet sich sofort wieder nach dem Start des Services
Code: Alles auswählen
# cat my-restart@.target
[Unit]
Wants=%i
Before=%i
StopWhenUnneeded=true
Schließlich noch die Unit für den Testserver
Code: Alles auswählen
# cat my-server.service
[Unit]
Description=MEIN_TEST_SERVER
[Service]
ExecStart=/usr/local/bin/my-test.sh
Und noch der Inhalt des Testservers:
Code: Alles auswählen
# cat /usr/local/bin/my-test.sh
#!/bin/bash
while :
do
echo "SERVER_IS_RUNNING"
sleep 1
done
exit 0
Und der Inhalt des Dump-Skriptes:
Code: Alles auswählen
# cat /usr/local/bin/my-dump.sh
#!/bin/bash
echo "DB_DUMP_START"
sleep 5
echo "DB_DUMP_STOP"
exit 0
Du kannst den Server gleich so starten, dass am Begin der Dump gemacht wird und dann der Server gestartet wird:
Mit dem selben Befehl stößt du aber auch an, dass der Server gestoppt wird, dann wird der Dump gemacht, und der Server wird wieder gestartet.
Wenn der Server einfach mit dem multi-user.target gestartet werden soll, dann kommt natürlich in my-server.service noch
hinzu.
Wie wirst du denn um 3 in der Früh den Sync starten? Mit cron, mit systemd-cron oder mit einer systemd-timer-unit?
Dementsprechend musst du halt dann my-dump@.target noch um eine Install-Section erweitern oder den oben genannten Aufruf in ein Skript oder Timer-Unit einbauen.
Soweit einmal von mir mein Vorschlag. Ist ein wenig kompliziert. Systemd scheint für solche Anwendungsfälle nicht unbedingt gebaut zu sein. Versucht man es nur mit Before= After= Conflicts= zu lösen, erzeugt man damit bloß Abhängigkeitsschleifen, die systemd nicht auflösen kann. Daher auch die Entkoppelung über Timer und Targets.
lg scientific