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

33

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 stopmon service expire après 60 secondes.

Vérification avec journalctl -b -u SERVICE.serviceje 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]

Je l' ai déjà essayé de changer la DefaultTimeoutStopSecpropriété à /etc/systemd/system.confla 90s, mais le délai d' attente arrive encore.

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 -waitparamètre avec la valeur 120.

César Ralf
la source

Réponses:

55

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 desystemd : Run systemctl edit --full node.service( remplacez "node" par votre nom de service ).
      • Cela créera 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 systemctl editsont ici .
    • Édition 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 d'éditer directement des fichiers dans /usr/lib/systemd/(Voir les commentaires)
  2. Utilisez TimeoutStartSec, TimeoutStopSecou 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):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  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 ne fonctionne pas , essayez de redémarrer systemctl avecsystemctl reboot
  6. Si cela ne fonctionne pas , essayez d' utiliser l' --no-blockoption 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 à la systemctl maskplace 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 les modifier /usr/lib/systemd/system, essayez systemctl editplutôt ou modifiez-les /etc/systemd/systemà la place. Vous ne devez jamais modifier les fichiers de service dans /usr/lib/. Crédit @ryeager et @ 0xC0000022L
Katie
la source
8
TimeoutSec=infinity- ne serait-il pas possible que ce bloc redémarre indéfiniment? Et s'il faut «toujours» pour que ce processus se termine? Je suggérerais une grande quantité, comme 5min, mais probablement pas infinity...
Alexis Wilke
6
vous ne devez pas modifier les fichiers de service dans / usr / lib, vous devez les modifier ou les remplacer dans / etc / systemd / system
ryeager
5
Bien que l'essentiel des conseils soit solide, je dois être d'accord avec @ryeager ... des versions modernes de l' systemdoffre systemctl edit(et maskles désactiver avec la force brute, par opposition à disable) à cette fin. Vous ne devez jamais modifier les fichiers dans /usr/lib/systemd.
0xC0000022L
3
TimeoutSec=infinityn'a pas fonctionné ici, j'ai utilisé TimeOutSec=900(15 min) et cela a sauvé mon postérieur. - J'avais besoin de courir systemctl daemon-reloadaprès, avant de redémarrer le service.
JCCyC
10

En cours d'exécution, systemctl show SERVICE_NAME.service -p TimeoutStopUSecje pouvais 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.

César Ralf
la source