it-swarm.com.de

Wie ändere ich das Zeitlimit für den Systemdienst?

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

Da viele Berechnungen erforderlich sind, dauert der Abschluss dieses Dienstes etwa 70 Sekunden. Ich habe kein Timeout für systemd konfiguriert und die Standardkonfigurationen bei /etc/systemd/system.conf Nicht geändert. Wenn ich jedoch service SERVICE stop Ausführe, läuft mein Dienst nach 60 Sekunden ab.

Überprüfung mit journalctl -b -u SERVICE.service Ich finde 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 Eigenschaft DefaultTimeoutStopSec bei /etc/systemd/system.conf In 90s Zu ändern, aber das Timeout tritt immer noch auf.

Hat jemand eine Idee, warum es eine Zeitüberschreitung in den 60ern gibt? Gibt es irgendwo anders, dass dieser Timeout-Wert konfiguriert ist? Gibt es eine Möglichkeit, dies zu überprüfen?

Dieser Dienst wird mit Java 7) ausgeführt und verwendet zum Dämonisieren JSVC . Ich habe den -wait Konfiguriert. Parameter mit dem Wert 120.

37
Caesar Ralf

Mein systemd-Dienst lief immer wieder aus, weil es auch so lange dauern würde, bis er hochgefahren war. Das hat es für mich behoben:

  1. Bearbeiten Sie Ihre systemd-Datei:
    • Für moderne Versionen von systemd: Run systemctl edit --full node.service ( Ersetzen Sie "Knoten" durch Ihren Dienstnamen .
      • Dadurch wird eine Systemdatei bei /etc/systemd/system/node.service.d/ Erstellt, die die Systemdatei bei /usr/lib/systemd/system/node.service Überschreibt. Dies ist der richtige Weg, um Ihre Systemdateien zu konfigurieren. Weitere Informationen zur Verwendung von systemctl edit Finden Sie hier .
    • Systemdatei direkt bearbeiten: Die Systemdatei befindet sich für mich unter /usr/lib/systemd/system/node.service. Ersetzen Sie "Knoten" durch Ihren Anwendungsnamen. Es ist jedoch nicht sicher, Dateien in /usr/lib/systemd/ Direkt zu bearbeiten (siehe Kommentare).
  2. Verwenden Sie TimeoutStartSec, TimeoutStopSec oder TimeoutSec (weitere Informationen hier ), um anzugeben, wie lange das Timeout zum Starten und Stoppen des Prozesses dauern soll. Danach sah meine systemd-Datei folgendermaßen 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 dieser Optionen ausführen (Sie müssen jedoch Ihren Dienst bearbeiten, um Änderungen vorzunehmen! Siehe Schritt 1). Verwirrenderweise haben die zugehörigen Eigenschaften für Mikrosekunden ein "U" im Namen. Weitere Informationen finden Sie unter diese Github-Ausgabe :
      • systemctl show node.service -p TimeoutStartUSec
      • systemctl show node.service -p TimeoutStopUSec
      • systemctl show node.service -p TimeoutUSec
  3. Als nächstes müssen Sie das System mit systemctl reload node.service neu laden.

  4. Versuchen Sie nun, Ihren Dienst mit systemctl start node.service zu starten.
  5. Wenn das nicht funktioniert hat Versuchen Sie, systemctl mit systemctl reboot neu zu starten.
  6. Wenn das nicht funktioniert hat Versuchen Sie, die Option --no-block Für systemctl wie folgt zu verwenden: systemctl --no-block start node.service. Diese Option wird beschrieben hier : "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 des Geräts abgeschlossen ist Wenn Sie dieses Argument weitergeben, wird es nur überprüft und in die Warteschlange gestellt. "
    • Es besteht auch die Möglichkeit, systemctl mask Anstelle von systemctl start Zu verwenden. Weitere Informationen finden Sie unter hier .

Aktualisierungen aus Kommentaren:

  • TimeoutSec=infinity: Anstatt hier "unendlich" zu verwenden, nehmen Sie sich stattdessen viel Zeit, wie TimeoutSec=900 (15 min). Wenn das Beenden der Anwendung "für immer" dauert, wird ein Neustart möglicherweise auf unbestimmte Zeit blockiert. Gutschrift @Alexis Wilke und @JCCyC
  • Anstatt /usr/lib/systemd/system Zu bearbeiten, versuchen Sie stattdessen systemctl edit Oder bearbeiten Sie /etc/systemd/system, Um sie stattdessen zu überschreiben. Sie sollten niemals Servicedateien in /usr/lib/ Bearbeiten. Credit @ryeager und @ 0xC0000022L
64
Katie

Laufen systemctl show SERVICE_NAME.service -p TimeoutStopUSec Ich konnte zumindest das von systemd für meinen Dienst festgelegte Zeitlimit sehen.

Ich habe das Skript in eine normale Einheitendatei geändert, damit es ordnungsgemäß funktioniert.

10
Caesar Ralf

Anstatt die Servicedatei des Pakets in /usr/lib/systemd/system/ Zu bearbeiten, die beim Paket-Upgrade überschrieben wird, verwenden Sie:

Sudo EDITOR=/bin/vi systemctl edit <service-name>

(Ja, Nano ist der Standardeditor! Eeugh!)

Dadurch wird die Datei /etc/systemd/system/service-name.service.d/override.conf Sicher bearbeitet.

Diese Datei muss nur enthalten:

[Service]
# Override default 90 second timeout in pathological conditions
TimeoutStopSec=5  # or whatever value you want

Sehen Sie sich den Gesamteffekt an, indem Sie Folgendes eingeben:

systemctl cat <service-name>
0
Tom Hale