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
.
Mon service systemd a continué à expirer en raison du temps qu'il faudrait également pour démarrer, donc cela m'a corrigé:
systemd
: Exécutez systemctl edit --full node.service
( remplacez "node" par le nom de votre service ). /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 ./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)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
systemctl show node.service -p TimeoutStartUSec
systemctl show node.service -p TimeoutStopUSec
systemctl show node.service -p TimeoutUSec
Ensuite, vous devrez recharger le systemd avec systemctl reload node.service
systemctl start node.service
systemctl reboot
--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. "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/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 @ 0xC0000022LFonctionnement 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.
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>