web-dev-qa-db-fra.com

Comment changer la valeur du délai d'expiration du service systemd?

Dans l'entreprise dans laquelle je travaille actuellement, il existe un service hérité et son script d'initialisation utilise l'ancien SysvInit, mais fonctionne sur systemd (CentOS 7).

Parce qu'il y a beaucoup de calculs, ce service prend environ 70 secondes pour terminer. Je n'ai configuré aucun délai d'expiration pour systemd et je n'ai pas modifié les configurations par défaut à /etc/systemd/system.conf, mais quand j'exécute service SERVICE stop mon service expire après 60 secondes.

Vérification avec journalctl -b -u SERVICE.service Je trouve ce journal:

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]

J'ai déjà essayé de modifier la propriété DefaultTimeoutStopSec dans /etc/systemd/system.conf à 90s, mais le délai d'expiration se produit toujours.

Quelqu'un a-t-il une idée de la raison pour laquelle le délai d'attente est de 60 ans? Y a-t-il ailleurs que cette valeur de délai d'attente est configurée? Existe-t-il un moyen de le vérifier?

Ce service fonctionne avec Java 7 et pour le démonifier, il utilise JSVC . J'ai configuré le -wait paramètre avec la valeur 120.

37
Caesar Ralf

Mon service systemd a continué à expirer en raison du temps qu'il faudrait également pour démarrer, donc cela m'a corrigé:

  1. Modifiez votre fichier systemd:
    • Pour les versions modernes de systemd: Exécutez systemctl edit --full node.service ( remplacez "node" par le nom de votre service ).
      • Cela va créer un fichier système à /etc/systemd/system/node.service.d/ qui remplacera le fichier système à /usr/lib/systemd/system/node.service. C'est la bonne façon de configurer vos fichiers système. Plus d'informations sur l'utilisation de systemctl edit est ici .
    • Modification directe du fichier système: Le fichier système pour moi est à /usr/lib/systemd/system/node.service. Remplacez "node" par le nom de votre application. Cependant, il n'est pas sûr de modifier directement des fichiers dans /usr/lib/systemd/ (Voir les commentaires)
  2. Utilisez TimeoutStartSec, TimeoutStopSec ou TimeoutSec (plus d'informations ici ) pour spécifier la durée du délai d'expiration pour démarrer et arrêter le processus. Ensuite, voici à quoi ressemblait mon fichier systemd:

    [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
    
    • Vous pouvez également afficher l'état actuel du délai d'expiration en exécutant l'un d'entre eux (mais vous devrez modifier votre service pour apporter des modifications! Voir l'étape 1). Confusément, les propriétés associées ont un "U" dans leur nom pour les microsecondes. Voir ce numéro Github pour plus d'informations:
      • systemctl show node.service -p TimeoutStartUSec
      • systemctl show node.service -p TimeoutStopUSec
      • systemctl show node.service -p TimeoutUSec
  3. Ensuite, vous devrez recharger le systemd avec systemctl reload node.service

  4. Essayez maintenant de démarrer votre service avec systemctl start node.service
  5. Si cela n'a pas fonctionné, essayez de redémarrer systemctl avec systemctl reboot
  6. Si cela n'a pas fonctionné, essayez d'utiliser le --no-block option pour systemctl comme ceci: systemctl --no-block start node.service. Cette option est décrite ici : "N'attendez pas de manière synchrone la fin de l'opération demandée. Si cela n'est pas spécifié, le travail sera vérifié, mis en file d'attente et systemctl attendra jusqu'à ce que le démarrage de l'unité soit terminé. . En passant cet argument, il est uniquement vérifié et mis en file d'attente. "
    • Il y a aussi la possibilité d'utiliser systemctl mask au lieu de systemctl start. Pour plus d'informations, voir ici .

Mises à jour des commentaires:

  • TimeoutSec=infinity: Au lieu d'utiliser "infini" ici, mettez plutôt beaucoup de temps, comme TimeoutSec=900 (15 min). Si l'application prend "indéfiniment" pour quitter, il est possible qu'elle bloque un redémarrage indéfiniment. Crédit @Alexis Wilke et @JCCyC
  • Au lieu de modifier /usr/lib/systemd/system, essayez systemctl edit à la place ou modifiez /etc/systemd/system pour les remplacer à la place. Vous ne devez jamais modifier les fichiers de service dans /usr/lib/. Crédit @ryeager et @ 0xC0000022L
64
Katie

Fonctionnement systemctl show SERVICE_NAME.service -p TimeoutStopUSec J'ai pu au moins voir le délai d'attente défini par systemd à mon service.

J'ai changé le script en un fichier d'unité ordinaire pour qu'il fonctionne correctement.

10
Caesar Ralf

Au lieu de modifier le fichier de service du package dans /usr/lib/systemd/system/ qui sera remplacé lors de la mise à niveau du package, utilisez:

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

(Oui, nano est l'éditeur par défaut! Eeugh!)

Cela modifiera le fichier en toute sécurité /etc/systemd/system/service-name.service.d/override.conf.

Ce fichier ne doit contenir que:

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

Voyez l'effet global en tapant:

systemctl cat <service-name>
0
Tom Hale