it-swarm.com.de

Systemd-Dienst funktioniert nicht

Ich habe gerade von 14.04 Server auf 16.04 Server umgestellt. Bei Upstart habe ich meinen Server mit einer Datei namens M95 gestartet, die ich in /etc/rcS.d hatte. M95 wurde von /etc/rc.local aufgerufen. Jetzt habe ich mit systemd eine Datei namens my.service in/etc/systemd/system geschrieben. Es sieht aus wie das:

[Unit]
Description=MyService

[Service]
WorkingDirectory=/etc
ExecStart=/bin/sh rc.local

[Install]
WantedBy=multi-user.target

Wenn ich "/ bin/sh rc.local" in die Befehlszeile eingebe, startet mein Server. Wenn ich versuche, den Dienst mit "systemctl start my.service" zu starten, passiert nichts.

Die relevanten Zeilen in journalctl -b sind:

Started MyService.
eth0 ...(basically the info I see from ifconfig)
root : TTY=unknown ; PWD=/etc ; USER=root ; COMMAND=/etc/rcS.d/M95
pam_unix(Sudo:session): session opened for user root by (uid=0)
$File not found:: /new/den-routes
udhcpd already running
pam_unix(Sudo:session): session closed for user root
/bin/rm: cannot remove '/var/log/rewriting-net-rules': No such file or directory.

In rc.local sieht es so aus:

#!/bin/sh -e
...
Sudo /etc/rcS.d/M95
/bin/rm /var/log/rewriting-net-rules

exit 0

In M95 wird udhcpd gestartet (von wo die Meldung "udhcpd wird bereits ausgeführt" stammt) und am Ende der Server mit den folgenden Worten gestartet:

cd /new
/bin/sh StartServer&

Es scheint, dass es zu M95 kommt, weil Nachrichten von ihm protokolliert werden, aber der Server nicht gestartet wird. Wenn ich diese Dateien in der Befehlszeile ausführe, funktioniert es, aber als Dienst funktioniert es nicht. Ich bin mit systemd sehr unbekannt, daher habe ich keine Ahnung, ob ich das richtig mache. Ich habe eine Woche lang Beispiele und Tutorials dafür gelesen, bin mir aber immer noch nicht sicher, wie dies funktioniert und wie die Servicedatei geschrieben werden soll.

Bearbeiten: Hier ist meine StartServer-Datei:

#!/bin/bash
Nohup /jre/jdk1.8.0_101/jre/bin/myserver -Xrs -Xmx1000m -jar /new/MyServer.jar nowd &

Es läuft gut, wenn ich es von der Kommandozeile aus starte. Es läuft, wenn ich es von my.service aus anrufe. Ich habe ein paar Echos eingefügt, um zu sehen, dass es die ganze Datei durchläuft, aber myserver und MyServer.jar starten aus irgendeinem Grund nicht.

1
khm

Es stellte sich heraus, dass das Problem in einem Teil des Codes in rc.local lag. Eine Zeile, die jemand beim Versuch eingibt, eine Datei zu entfernen, führt zu einem Fehler und führt zum Beenden des Programms, wenn die Datei nicht vorhanden ist. Ich bin mir nicht sicher, warum dieser Fehler nicht aufgetreten ist, als ich ihn in der Befehlszeile ausgeführt habe, aber als ich ihn mit einem Dienst ausgeführt habe, hat er alles aufgehört zu funktionieren.

Ich habe es behoben, indem ich eine if-Anweisung hinzugefügt habe, um zu überprüfen, ob diese Datei existiert, bevor ich versuche, sie zu entfernen.

0
khm

Meine Güte, hier stimmt vieles nicht.

  • Sie führen Ihren Dienst nicht direkt aus. Stattdessen führt Ihre Service-Einheit eine Shell aus, die rc.local im Arbeitsverzeichnis /etc interpretiert. Dies trotz der Tatsache, dass systemd eine vorab gelieferte Service-Einheit zum Ausführen von /etc/rc.local Hat, wenn man wirklich möchte. (rc.local Ist ein Mechanismus, der unter Ubuntu dreimal ersetzt wurde, zuerst von van Smoorenburg rc, dann von upstart, dann von systemd.)
  • Aber /etc/rc.local Führt auch Ihren Dienst nicht aus. Stattdessen wird Sudo aufgerufen, obwohl es bereits als Superuser ausgeführt wird.
  • Dies führt wiederum ein (zweites) Skript aus /etc/rcS.d Aus, obwohl das Verzeichnis eine symbolische Linkfarm ist, die eigentlich keine rc Skriptdateien enthalten soll.
  • Dieses Skript wird von Hand ausgeführt, um sicherzustellen, dass systemd bereits als eigentlicher Dienst ausgeführt wird.
  • Es ist der Ansicht, dass das Arbeitsverzeichnis /new Und nicht /etc Sein sollte.
  • Aber auch das ist nicht dein Dienst. Stattdessen veranlasst es eine Shell, ein drittes Skript namens StartServer zu interpretieren.
  • Es verwendet exec nicht, um sich selbst zu überlagern.
  • Es verwendet &, Um diese Shell asynchron auszuführen.
  • Dieses vierte Skript gibt dann ein Java Programm aus und führt es aus.
  • Es wird auch nicht exec verwendet, um sich selbst zu überlagern.
  • Und das i-Tüpfelchen ist, dass das also Verwenden von &, Um das Java Programm asynchron auszuführen.

Nichts davon ist notwendig.

Und Sie scheinen ohne ersichtlichen Grund, es mitten in einem Mechanismus zum Zurücksetzen von MAC-Adressen in geklonten virtuellen Maschinen installiert zu haben.

[Unit] 
 Documentation = https: //askubuntu.com/a/831314/43344 
 After = udhcpd.service 
 
 [Service] 
 WorkingDirectory =/new 
 ExecStart =/jre/jdk1.8.0_101/jre/bin/myserver -Xrs -Xmx1000m -jar /new/MyServer.jar nowd 
 
 [Install ] 
 WantedBy = Multi-user.target

Es gibt auch einen After= - Zusatz, der benötigt wird, um die Datei den-routes Zu schreiben, die Ihr Dæmon erwartet. Sie geben jedoch keine Informationen an, um festzustellen, was das ist.

Weitere Lektüre

4
JdeBP