it-swarm.com.de

Wie stellen Sie sicher, dass eine Verzögerung auftritt, bevor ein Dienst in systemd gestartet wird

Ich habe einen Service, der davon abhängt, dass Cassandra anmutig erscheint und der Cluster bereit ist.

Um sicherzustellen, dass die Abhängigkeitsreihenfolge erfüllt ist, habe ich die folgende Einheitendatei 

[Unit]
Requires=cassandra.service
After=cassandra.service

[Service]
Environment=Java_HOME=/usr/Java/jre
[email protected]@/webapps/bringup-app/bin/bringup
TimeoutStartSec=0
ExecStop=
[email protected]@/logs/bringup.pid
Restart=always

[Install]
WantedBy=multi-user.target

Wie stelle ich sicher, dass der Bringup-App-Prozess 30 Sekunden wartet, bevor er startet? Obwohl es nach Cassandra gestartet wurde, habe ich festgestellt, dass der Cassandra-Cluster noch nicht in Betrieb ist. Daher schlägt der Versuch der Bringup-App fehl, sich während des Startvorgangs mit Cassandra zu verbinden. 

Ich möchte deshalb eine Verzögerung hinzufügen. Ist das über die Unit-Datei möglich?

19

Sie können den Befehl sleep vor Ihrem ExecStart mit ExecStartPre ausführen:

[Service]
ExecStartPre=/bin/sleep 30
26
Ortomala Lokni

Diese Antwort auf Superbenutzer ist meiner Meinung nach eine bessere Antwort . https://superuser.com/a/573761/67952

Da Sie jedoch nach einem Weg ohne Vorher und Nachher gefragt haben, können Sie Folgendes verwenden:

Type=idle

was als man systemd.service erklärt

Das Verhalten im Leerlauf ist dem einfachen sehr ähnlich; Die eigentliche Ausführung des Serviceprogramms wird jedoch verzögert, bis alle aktiven Jobs abgesetzt sind. Dies kann verwendet werden, um eine Verschachtelung der Ausgabe von .__ zu vermeiden. Shell-Dienste mit Statusausgabe auf der Konsole. Beachten Sie, dass dieser Typ nur zur Verbesserung der Konsolenausgabe nützlich ist. Er ist nicht als allgemeines Werkzeug zum Bestellen von Einheiten nützlich und der Effekt davon. Der Servicetyp unterliegt einem Timeout von 5 Sekunden, wonach das Serviceprogramm trotzdem aufgerufen wird.

5
nelaaro

Sie können eine .timer systemd-Einheitendatei erstellen, um die Ausführung Ihrer .service-Einheitendatei zu steuern.

Um beispielsweise nach dem Start 1 Minute zu warten, bevor Sie Ihren foo.service starten, erstellen Sie eine foo.timer-Datei in demselben Verzeichnis mit dem Inhalt:

[Timer]
OnBootSec=1min

Hier finden Sie einige weitere Optionen und alle benötigten Informationen: https://wiki.archlinux.org/index.php/Systemd/Timers

4
Zantsu

Die systemd Möglichkeit, dies zu tun, besteht darin, den Prozess "zurückzusprechen", wenn er in irgendeiner Weise eingerichtet wird, z. B. durch Öffnen eines Sockets oder Senden eines Benachrichtigung (oder Beenden eines übergeordneten Skripts). Das ist natürlich nicht immer einfach, besonders bei Sachen von Drittanbietern: |

Sie könnten in der Lage sein, etwas wie Inline zu tun

ExecStart=/bin/bash -c '/bin/start_cassandra &; do_bash_loop_waiting_for_it_to_come_up_here'

oder ein Skript, das das gleiche tut. Oder setze do_bash_loop_waiting_for_it_to_come_up_here in einem ExecStartPost

Oder erstellen Sie einen Helfer-Service, der darauf wartet, dass er ausgeführt wird. Der Helfer-Service hängt also von cassandra ab und wartet darauf, dass er ausgeführt wird. Dann kann Ihr anderer Prozess vom Helfer-Service abhängen.

(Möglicherweise möchten Sie TimeoutStartSec auch von den Standard-90ern erhöhen.)

1
rogerdpack

Fügen Sie nicht den Bringup-Dienst hinzu, sondern fügen Sie dem Dienst eine Verzögerung nach dem Start hinzu, von der er abhängig ist. Bearbeiten Sie cassandra.service so:

ExecStartPost=/bin/sleep 30

Auf diese Weise sollte der zusätzliche Schlaf den Neustart von Bringup nicht verlangsamen.

0
bviktor