Ich verwende CentOS 7. Wie finde ich heraus, warum ein Dienst nicht gestartet werden kann? Ich habe diesen Service erstellt
[rails@server ~]$ sudo cat /usr/lib/systemd/system/nodejs.service
[Unit]
Description=nodejs server
[Service]
User=rails
Group=rails
ExecStart=/home/rails/NodeJSserver/start.sh
ExecStop=/home/rails/NodeJSserver/stop.sh
[Install]
WantedBy=multi-user.target
Die Datei zeigt darauf
[rails@server ~]$ cat /home/rails/NodeJSserver/start.sh
#!/bin/bash
forever start /home/rails/NodeJSserver/server.js
Ich kann diese Datei ganz gut alleine ausführen. Wenn ich jedoch versuche, es als Teil des Dienstes auszuführen, stelle ich fest, dass mein nodeJS-Server nicht gestartet ist. Selbst wenn ich "sudo systemctl --state = failed" überprüfe, sehe ich keine Fehler ...
[rails@server ~]$ sudo systemctl enable NodeJSserver
[rails@server ~]$ sudo systemctl start NodeJSserver
[rails@server ~]$
[rails@server ~]$
[rails@server ~]$ forever list
info: No forever processes running
[rails@server ~]$
[rails@server ~]$
[rails@server ~]$ sudo systemctl --state=failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● nginx.service loaded failed failed The nginx HTTP and reverse proxy server
● systemd-sysctl.service loaded failed failed Apply Kernel Variables
● systemd-vconsole-setup.service loaded failed failed Setup Virtual Console
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
3 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
Wie finde ich heraus, warum mein Dienst nicht gestartet werden konnte?
journalctl -u nodejs
sollte Ihnen eine aussagekräftigere Fehlermeldung geben.Antworten:
Ihr Dienst ist
Type=
in diesem[Service]
Abschnitt nicht angegeben , es wird alsosystemd
davon ausgegangen , dass Sie dies gemeint habenType=simple
.Das bedeutet
systemd
, dass der Prozess, mit dem gestartet wurdeExecStart=
, so lange ausgeführt wird, wie der Dienst ausgeführt wird. Aber es sieht so aus, als ob Siestart.sh
nur einen Befehl ausführen und dann beenden. Das ist derforever
Befehl :forever start
Startet den Zielbefehl als Daemon oder mit anderen Worten im Hintergrund. Sobald derforever start
Befehl abgeschlossen ist, wird die ausgeführte Shell beendetstart.sh
.Zu diesem Zeitpunkt wird
systemd
dieser Dienst als fehlgeschlagen betrachtet. Warten Sie, die für diesen Dienst zugewiesene Kontrollgruppe enthält noch einen laufenden Prozess. "Also", denktsystemd
, "ist es nicht nur gescheitert, sondern hat auch ein Chaos hinter sich gelassen. Das kann man nicht haben." Da wederKillMode=
nochKillSignal=
angegeben, werdensystemd
die Standardeinstellungen fortgesetzt und ein SIGTERM für alle verbleibenden Prozesse in dieser Kontrollgruppe gesendet. Wenn diese nicht rechtzeitig beendet werden, wird ein SIGKILL angezeigt. Danach ist Ihr tatsächlicher NodeJS-Prozess garantiert tot.Wie man es repariert
Da der Befehl, mit dem Sie ausgeführt werden, beendet
ExecStart=
wird, sobald der eigentliche Server gestartet wird, können Sie die Standardeinstellung nicht verwendenType=simple
. Sie müssen einen anderen Diensttyp angeben.Sie könnten die verwenden
Type=forking
. Bei diesem Typ wirdman systemd.service
die Verwendung einerPIDFile=
Option empfohlen. Wenn Ihr NodeJS-Server also eine PID-Datei für sich selbst erstellt (oder Sie demforever
Befehl Optionen hinzufügen , damit er eine für ihn erstellt), sollten Siesystemd
wissen, wo sich diese befindet.Wenn
Type=forking
bei Ihnen nicht funktioniert, dann können Sie angeben ,Type=oneshot
mitRemainAfterExit=yes
.Das macht
systemd
führen Sie einfach dasExecStart=
Kommando , wenn der Dienst starten undExecStop=
wenn es zu stoppen, und was sonst noch nicht.systemd
Ich werde mich jedoch immer noch daran erinnern, ob der Dienst zuletzt in einem gestoppten oder gestarteten Zustand eingestellt wurde. Wenn Sie also einen anderen Dienst so einstellen, dass er von diesem Dienst abhängt, und dann Ihren NodeJS-Dienst manuell beenden, wird der andere Dienst nicht automatisch beendet und gibt zweifellos Fehler zurück, wenn er Ihren NodeJS-Dienst nicht verwenden kann.Die dritte Möglichkeit besteht darin, den
forever
Befehl vollständig zu überspringen undsystemd
den NodeJS-Prozess neu zu starten. In diesem Fallnodejs.service
wäre Ihre gesamte Einheit:Sie können weitere Optionen hinzufügen.
Sie können beispielsweise angeben
RestartSec=5
, dass vor dem Neustart des Dienstes ein 5-Sekunden-Ruhezustand angegeben werden soll, wenn der Dienst unerwartet beendet wird, um zu vermeiden, dass die Systemressourcen durch häufige Neustartversuche belastet werden, wenn Ihr Dienst aus irgendeinem Grund unmittelbar nach dem Neustart weiterhin ausfällt. (Der StandardwertRestartSec=
ist 100 ms.)Wenn Sie möchten, dass der Dienst neu gestartet wird, wenn er bestimmte Exit-Statuswerte zurückgibt, bei anderen jedoch davon ausgeht, dass er bei anderen fehlgeschlagen ist, gibt es auch dafür Optionen.
quelle
Restart=always
meine .service-Konfigurationsdatei hinzufügen musste.