4 votes

Variables système globales pour les scripts d'initialisation et le système ?

J'ai créé mes propres scripts d'initialisation qui utilisent des variables :

#! /bin/sh

case "$1" in
    start)
        echo "Démarrage de l'API publique"
        sudo -u techops sh ${JBOSS_HOME_PUBLIC_API}/bin/standalone.sh > ${PUBLICAPI_LOGGING_PATH} &
    ;;
    stop)
        echo "Arrêt de l'API publique"
        sudo -u techops sh ${JBOSS_HOME_PUBLIC_API}/bin/jboss-cli.sh --connect --controller=localhost:$((9990 + $PUBLICAPI_PORT_OFFSET)) command=:shutdown > ${PUBLICAPI_LOGGING_PATH} &
    ;;
    *)
        echo "Utilisation: /etc/init.d/publicapi {start|stop}"
        exit 1
    ;;
esac

exit 0

Les variables sont définies dans /etc/environment et ont cet aspect :

PUBLICAPI_PORT_OFFSET=0
PUBLICAPI_LOGGING_PATH=/var/log/publicapi/publicapi.log
JBOSS_HOME_PUBLIC_API=/opt/publicapi

...et fonctionnent après la connexion, lorsque je démarre et arrête le script d'initialisation manuellement, mais elles ne fonctionnent pas pour les scripts d'initialisation au démarrage (qui sont des liens symboliques vers /etc/init.d/publicapi dans /etc/rc2.d/, /etc/rc5.d/, /etc/rc6.d/). Le démarrage échoue alors, car les variables sont inconnues.

J'ai pu corriger cela en exécutant systemctl edit publicapi, ce qui a créé un fichier /etc/systemd/system/publicapi.service.d/local.conf qui ressemble à ceci après que je l'ai édité :

[Unit]
Description=Script de démarrage de l'API publique
Documentation=aucune documentation

[Service]
Environment="JBOSS_HOME_PUBLIC_API=/opt/publicapi"
Environment="PUBLICAPI_PORT_OFFSET=0"
Environment="PUBLICAPI_LOGGING_PATH=/var/log/publicapi/publicapi.log"

lorsque je redémarre, le démarrage du script d'initialisation fonctionne. Mais maintenant, j'ai une situation étrange : Je dois toujours définir la variable à la fois dans /etc/systemd/system/publicapi.service.d/local.conf et dans /etc/environment. Si j'omets celles de /etc/environment, les scripts de démarrage s'exécutent mais échouent, car les variables semblent ne pas être définies (du moins après la connexion). si je commente les variables dans /etc/systemd/system/publicapi.service.d/local.conf et les définis dans /etc/environment uniquement, les variables sont définies après la connexion, mais les scripts de démarrage ne sont pas exécutés. Que se passe-t-il ici ? Quelle est la portée de /etc/systemd/system/publicapi.service.d/local.conf (car les valeurs ont apparemment disparu après la connexion ou peut-être ne sont pas définies) ? Comment puis-je définir les variables une seule fois de manière globale ?

3voto

Robert Riedl Points 4103

Ce qui se passe ici, c'est que vous écrivez un script init de système V sur un système qui exécute systemd.

Votre systemd est quelque peu rétrocompatible et exécutera ces anciens scripts init de manière émulée, mais les traitera comme systemd.

Je pense que vous aurez plus de facilité à abandonner votre ancien script init et à écrire un nouveau service systemd. De cette façon, vous n'avez pas besoin de /etc/environment.

Voici plus de lecture sur comment écrire des services systemd.

1voto

Chris Points 377

Je peux maintenant répondre à la question moi-même. Après avoir perdu une demi-journée avec ce truc de bricolage j'ai trouvé une solution qui fonctionne. Il n'y a plus de scripts init dans /etc/init.d/ ou /etc/rcX.d) ou n'importe où :

*) /etc/environment

JBOSS_HOME_CONSENT_SERVER=/opt/consent-server
CONSENT_SERVER_LOGGING_PATH=/var/log/consentserver/consent-server.log
CONSENT_SERVER_PORT_OFFSET=3000

*) dans /home/techops créez un script consent-server avec ce contenu :

#!/bin/sh

case "$1" in
    start)
        echo "Démarrage du serveur Consent"
        sudo -u techops sh ${JBOSS_HOME_CONSENT_SERVER}/bin/standalone.sh > ${CONSENT_SERVER_LOGGING_PATH} &
    ;;
    stop)
        echo "Arrêt du serveur Consent"
        sudo -u techops sh ${JBOSS_HOME_CONSENT_SERVER}/bin/jboss-cli.sh --connect --controller=localhost:$((9990 + $CONSENT_SERVER_PORT_OFFSET)) command=:shutdown > ${CONSENT_SERVER_LOGGING_PATH} &
    ;;
    *)
        echo "Utilisation : systemctl {start|stop} consent-server ou passez {start|stop} en paramètre"
        exit 1
    ;;
esac

exit 0

*) Créez un fichier /etc/systemd/system/consent-server.service avec ce contenu :

[Unit]
Description=script de démarrage du serveur de consentement

[Service]
Type=oneshot
RemainAfterExit=yes
#si type=oneshot et RemainAfterExit=yes ne sont pas définis, alors le script s'arrête immédiatement !
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/consent-server start
ExecStop=/home/techops/consent-server stop

[Install]
WantedBy=multi-user.target

*) Activer le service (créera un lien symbolique) :

systemctl enable consent-server.service

Après le redémarrage, le service démarre automatiquement et toutes les variables sont reconnues. Vous pouvez également démarrer et arrêter le service avec systemctl start consent-server systemctl stop consent-server

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X