Wie ändere ich das Zeitlimit für den Systemd-Dienst?

33

In der Firma, in der ich jetzt arbeite, gibt es einen Legacy-Dienst, dessen Init-Skript altes SysvInit verwendet, aber über systemd (CentOS 7) ausgeführt wird.

Aufgrund des hohen Rechenaufwands dauert der Abschluss dieses Dienstes ca. 70 Sekunden. Ich habe keine Zeitüberschreitung für systemd konfiguriert und die Standardkonfiguration um nicht geändert /etc/systemd/system.conf, aber wenn ich service SERVICE stopmeinen Dienst ausführe , tritt nach 60 Sekunden eine Zeitüberschreitung auf .

Beim Überprüfen mit journalctl -b -u SERVICE.servicefinde ich dieses Protokoll:

Sep 02 11:27:46 service.hostname systemd[1]: Stopping LSB: Start/Stop
Sep 02 11:28:46 service.hostname SERVICE[24151]: Stopping service: Error code: 255
Sep 02 11:28:46 service.hostname SERVICE[24151]: [FAILED]

Ich habe bereits versucht, die DefaultTimeoutStopSecEigenschaft auf /etc/systemd/system.confzu ändern 90s, aber die Zeitüberschreitung tritt immer noch auf.

Hat jemand eine Idee, warum es bei 60s Timeout ist? Gibt es irgendwo anders, dass dieser Timeout-Wert konfiguriert ist? Kann ich das überprüfen?

Dieser Dienst wird mit Java 7 ausgeführt und verwendet JSVC , um ihn zu dämonisieren . Ich habe den -waitParameter mit dem Wert konfiguriert 120.

Caesar Ralf
quelle

Antworten:

54

Mein systemd-Dienst hat aufgrund der Zeitüberschreitung, die der Systemstart auch in Anspruch nehmen würde, ein Zeitlimit überschritten.

  1. Bearbeiten Sie Ihre Systemdatei:
    • Für moderne Versionen vonsystemd : Run systemctl edit --full node.service( ersetzen Sie "node" durch Ihren Dienstnamen ).
      • Dadurch wird eine Systemdatei erstellt /etc/systemd/system/node.service.d/, die die Systemdatei um überschreibt /usr/lib/systemd/system/node.service. Dies ist der richtige Weg, um Ihre Systemdateien zu konfigurieren. Weitere Informationen zum Gebrauch systemctl editist hier .
    • Systemdatei direkt bearbeiten : Die Systemdatei befindet sich bei mir unter /usr/lib/systemd/system/node.service. Ersetzen Sie "node" durch Ihren Anwendungsnamen. Es ist jedoch nicht sicher, Dateien direkt zu bearbeiten /usr/lib/systemd/(siehe Kommentare).
  2. Verwenden Sie TimeoutStartSec, TimeoutStopSecoder TimeoutSec(weitere Informationen hier ), um festzulegen, wie lange das Timeout zum Starten und Stoppen des Prozesses dauern soll. Danach sah meine systemd-Datei so aus:

    [Unit]
    Description=MyProject
    Documentation=man:node(1)
    After=rc-local.service
    
    [Service]
    WorkingDirectory=/home/myproject/GUIServer/Server/
    Environment="NODE_PATH=/usr/lib/node_modules"
    ExecStart=-/usr/bin/node Index.js
    Type=simple
    Restart=always
    KillMode=process
    TimeoutSec=900
    
    [Install]
    WantedBy=multi-user.target
    
    • Sie können den aktuellen Timeout-Status auch anzeigen, indem Sie eine der folgenden Aktionen ausführen (Sie müssen jedoch Ihren Dienst bearbeiten, um Änderungen vorzunehmen! Siehe Schritt 1):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. Als nächstes müssen Sie das System mit neu laden systemctl reload node.service
  4. Versuchen Sie nun, Ihren Dienst mit zu starten systemctl start node.service
  5. Wenn das nicht funktioniert hat , versuchen Sie mit systemctl neu zu startensystemctl reboot
  6. Wenn das nicht funktioniert hat , versuchen , die mit --no-blockOption für systemctl wie folgt: systemctl --no-block start node.service. Diese Option wird hier beschrieben : "Warten Sie nicht synchron, bis der angeforderte Vorgang abgeschlossen ist. Wenn dies nicht angegeben ist, wird der Job überprüft, in die Warteschlange gestellt und systemctl wartet, bis der Start der Einheit abgeschlossen ist. Durch Übergeben dieses Arguments wird er beendet wird nur überprüft und in die Warteschlange gestellt. "
    • Es gibt auch die Option, systemctl maskanstelle von zu verwenden systemctl start. Weitere Infos finden Sie hier .

Aktualisierungen von Comments:

  • TimeoutSec=infinity: Anstatt "infinity" hier zu verwenden, geben Sie stattdessen eine große Menge an Zeit ein, z. B. TimeoutSec=900(15 min). Wenn das Beenden der Anwendung "ewig" dauert, wird möglicherweise ein Neustart auf unbestimmte Zeit blockiert. Kredit @Alexis Wilke und @JCCyC
  • Statt Bearbeitung /usr/lib/systemd/system, versuchen Sie systemctl editstattdessen oder bearbeiten /etc/systemd/systemsie stattdessen außer Kraft zu setzen. Sie sollten niemals Servicedateien in bearbeiten /usr/lib/. Haben Sie @ryeager und @ 0xC0000022L gutgeschrieben
Katie
quelle
8
TimeoutSec=infinity- Wäre es nicht möglich, dass dieser einen Neustart auf unbestimmte Zeit blockiert? Was ist, wenn es "ewig" dauert, bis dieser Prozess beendet ist? Ich würde eine große Menge vorschlagen 5min, aber wahrscheinlich nicht infinity...
Alexis Wilke
6
Sie sollten keine Servicedateien in / usr / lib bearbeiten, Sie sollten sie in / etc / systemd / system
ryeager am
5
Während der Kern des Ratschlags solide ist, muss ich mich mit @ryeager einverstanden erklären ... modernen Versionen des systemdAngebots systemctl edit(und masksie mit brachialer Gewalt zu deaktivieren, im Gegensatz zu disable) für diesen Zweck. Sie sollten die Dateien in niemals bearbeiten /usr/lib/systemd.
0xC0000022L
3
TimeoutSec=infinityhat hier nicht funktioniert, habe ich benutzt TimeOutSec=900(15 min) und das hat meinen posterior gerettet. - Ich musste systemctl daemon-reloaddanach ausgeführt werden, bevor der Dienst neu gestartet wurde.
JCCyC
10

Beim Ausführen systemctl show SERVICE_NAME.service -p TimeoutStopUSeckonnte ich zumindest das von systemd für meinen Dienst festgelegte Zeitlimit feststellen.

Ich habe das Skript in eine reguläre Unit-Datei geändert, damit es ordnungsgemäß funktioniert.

Caesar Ralf
quelle