Wie führe ich einen einzelnen Befehl beim Start mit systemd aus?

113

Ich möchte einen Apache Spark-Cluster nach dem Start mit dem folgenden Befehl starten:

sudo ./path/to/spark/sbin/start-all.sh

Führen Sie dann diesen Befehl aus, wenn das System den Neustart / das Herunterfahren vorbereitet:

sudo ./path/to/spark/sbin/stop-all.sh

Wie kann ich anfangen? Gibt es eine grundlegende Vorlage, auf der ich aufbauen kann?

Ich habe versucht, eine extrem einfache (Datei:) zu verwenden /lib/systemd/system/spark.service:

[Unit]
Description=Spark service

[Service]
ExecStart=sudo ./path/to/spark/sbin/start-all.sh

Welches funktioniert nicht.

macourtney7
quelle
Schauen Sie sich
Hallo @WillemK, ich hatte mir diese Seite schon angeschaut. Dieses Problem fand ich ist , ich kann nicht einfach ersetzen execmit ExecStart=. Außerdem habe ich noch nie Emporkömmlinge benutzt.
macourtney7
1
Der Punkt vor dem Pfad Ihres Skripts sieht äußerst verdächtig aus.
Andrea Lazzarotto
@ AndreaLazzarotto Ich denke, OP versucht, das Skript so wie OP im Terminal .
auszuführen,
Hallo @AndreaLazzarotto, das ist richtig. Wir entschuldigen uns für die entstandene Verwirrung.
Macourtney7

Antworten:

143

Ihre .serviceDatei sollte folgendermaßen aussehen:

[Unit]
Description=Spark service

[Service]
ExecStart=/path/to/spark/sbin/start-all.sh

[Install]
WantedBy=multi-user.target

Führen Sie nun einige weitere Schritte aus, um die .serviceDatei zu aktivieren und zu verwenden :

  1. Legen Sie es in einen /lib/systemd/systemOrdner mit dem Namenmyfirst.service

  2. Stellen Sie sicher, dass Ihr Skript ausführbar ist mit:

    chmod u+x /path/to/spark/sbin/start-all.sh
    
  3. Starte es:

    sudo systemctl start myfirst
    
  4. Aktivieren Sie es, um beim Booten ausgeführt zu werden:

    sudo systemctl enable myfirst
    
  5. Hör auf:

    sudo systemctl stop myfirst
    

Anmerkungen:

  1. Sie müssen Spark nicht mit sudo in Ihrem Dienst starten, da der Standarddienstbenutzer bereits root ist.

  2. Weitere systemdOptionen finden Sie unter den folgenden Links .

AKTUALISIEREN

Was wir oben haben, ist nur rudimentär. Hier ist ein komplettes Setup für spark:

[Unit]
Description=Apache Spark Master and Slave Servers
After=network.target
After=systemd-user-sessions.service
After=network-online.target

[Service]
User=spark
Type=forking
ExecStart=/opt/spark-1.6.1-bin-hadoop2.6/sbin/start-all.sh
ExecStop=/opt/spark-1.6.1-bin-hadoop2.6/sbin/stop-all.sh
TimeoutSec=30
Restart=on-failure
RestartSec=30
StartLimitInterval=350
StartLimitBurst=10

[Install]
WantedBy=multi-user.target

So richten Sie den Dienst ein:

sudo systemctl start spark.service
sudo systemctl stop spark.service
sudo systemctl enable spark.service

Weitere Lektüre

Bitte lesen Sie die folgenden Links. Spark ist ein komplexes Setup, daher sollten Sie wissen, wie es in Ubuntus Init-Dienst integriert ist.

https://datasciencenovice.wordpress.com/2016/11/30/spark-stand-alone-cluster-as-a-systemd-service-ubuntu-16-04centos-7/

https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files

https://www.freedesktop.org/software/systemd/man/systemd.unit.html

George Udosen
quelle
Notiert und aktualisiert
George Udosen
1
Vielen Dank dafür, ich habe eine Datei erstellt, die auf Ihren Vorschlägen basiert. Beim Laufen sudo systemctl start sparkwird die folgende Fehlermeldung Failed to start spark.service: Unit spark.service is not loaded properly: Invalid argument. See system logs and 'systemctl status spark.service' for details.
angezeigt
Der Hauptteil von systemctl status spark.serviceist wie folgt: Executable path is not absoluteundspark.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
macourtney7
Die Probleme sind 1) Spark-Binärpfad (sollte ersetzen, was wir in der Servicedatei haben) wird benötigt, 2) Spark hat einen Befehl zum Herunterfahren, was es ist. 3) Sind Sie durch die Links gegangen, die ich Ihnen gegeben habe? Ich benutze keinen Funken, versorge sie also
George Udosen
@GeorgeUdosen Vielen Dank für Ihre Antwort, meine Frage ist , wie kann ich Funken unter einem bestimmten Befehl ausführen nach dem Neustart Die Frage ist hier? Askubuntu.com/questions/979498/...
Soheil Pourbafrani
2

Dies erstellt und läuft /root/boot.shbeim Booten (als root) mit einer minimalen Service-Datei:

bootscript=/root/boot.sh
servicename=customboot

cat > $bootscript <<EOF
#!/usr/bin/env bash
echo "$bootscript ran at $(date)!" > /tmp/it-works
EOF

chmod +x $bootscript

cat > /etc/systemd/system/$servicename.service <<EOF
[Service]
ExecStart=$bootscript
[Install]
WantedBy=default.target
EOF

systemctl enable $servicename

Sie können dies in ein Root-Terminal Ctrl+ C.

Um die Parameter zu ändern, um beispielsweise eine andere zu verwenden $bootscript, legen Sie diese Variable manuell fest und überspringen Sie diese Zeile, wenn Sie die Befehle kopieren.

Nachdem Sie die Befehle ausgeführt haben, können Sie das Startskript mit Ihrem bevorzugten Editor bearbeiten. Es wird beim nächsten Start ausgeführt. Sie können es auch sofort ausführen, indem Sie Folgendes verwenden:

systemctl start $servicename

Jeder Schritt könnte mit sudo ausgeführt werden, ist jedoch etwas komplizierter, und auf einigen Systemen ist sudo nicht installiert, sodass einige Benutzer das Beispiel vor der Verwendung ändern müssen. Aus diesem Grund habe ich beschlossen, sudo nicht in das Beispiel aufzunehmen.

Luc
quelle
Ich bin ein bisschen verwirrt von systemd docs, aber sollte es nicht so sein, Type=oneshot RemainAfterExit=yesoder systemd wird die Aufgabe als inaktiv betrachten, es sei denn, das benutzerdefinierte Skript lässt einige Prozesse laufen.
Peter Lamberg
@PeterLamberg Ich habe versucht, auch systemd docs zu lesen und doch sind wir beide hier;). Ich erinnere mich, dass sie nicht sehr klar waren, aber die Antwort, die ich gepostet habe, funktioniert auf mehreren Systemen (ich besuche diese Seite immer wieder, wenn ich sie wieder brauche). Meinen Sie damit, dass bei jedem nachfolgenden Start-Aufruf das Skript erneut ausgeführt wird, da es als "inaktiv" eingestuft wird? Weil ich das als erwartet für ein Shell-Skript ansehen würde. Ich würde es seltsam finden, wenn ich etwas stoppen müsste, das nicht wirklich läuft, bevor ich es wieder starten kann.
Luc