Question Définition de variables d'environnement sous Linux pour tous les processus


J'utilise Ubuntu 9.1 (Karmic Koala) sur mon serveur.

Une simple question de définir des variables d'environnement pour qu'elles soient globalement disponibles dans tous les processus me rend fou et j'apprécierais de l'aide!

J'ai essayé de les configurer en utilisant la commande d'exportation dans plusieurs emplacements «suspects habituels» tels que .bashrc, .bashrc, .profile. Ceux-ci fonctionnent très bien pour la coquille elle-même et les processus bifurquait la coque mais non pour les processus a commencé en dehors du shell (par exemple daemons ont lancé au démarrage ou particulièrement gênant pour moi est que Mongrel lancé par Capistrano ne semble pas avoir ces variables définies et donc Ruby n'y a pas accès).

J'ai également essayé des idées folles comme les configurer dans un script shell et appeler ce script au démarrage (via la méthode update-rc.d) en vain.

Sous Windows, vous pouvez simplement définir une "variable système" qui devient disponible dans tous les processus du système d'exploitation. Comment fait-on cela sous Linux? spécifiquement OS basé sur Debian?


4
2018-02-22 15:07


origine


Ce n'est pas vraiment une question de programmation, alors je vote pour migrer. - David Thornley
Comme demandé, cette question concerne la viande pour les super-utilisateurs, mais nous ne savons pas encore quel est le problème sous-jacent ... J'ai l'impression que bhavinb essaie de mettre en place une solution et que la bonne approche pourrait être un sujet de programmation. YMMV. - dmckee
... 10 heures et aucune autre explication, je suis pour envoyer ceci. - dmckee
merci d'avoir migré cette question. C'est en effet un meilleur endroit pour de telles questions - bhavinb


Réponses:


Les processus (y compris les shells) héritent uniquement des variables de leurs parents. Il n'y a aucun moyen de les changer de l'extérieur par la suite.

Définissez les "variables globales" le plus tôt possible dans le démarrage (pour les processus système) ou le shell (pour les processus utilisateur), ou renoncez à les définir à plusieurs endroits.

Cela peut sembler pénible, mais la possibilité de modifier un autre environnement de processus serait un bogue et introduirait toutes sortes de conditions de course désagréables.


Qu'est-ce que vous essayez de faire que vous voulez des variables d'environnement "globales"? Il y a peut-être moyen de contourner votre problème.

Solution de contournement:: Écrivez un script minimal dans votre format de coque préféré seulement définit la variable que vous voulez et placez-la dans un endroit accessible globalement:

/etc/loglocaltion.sh:

export MY_LOG_DIR=/opt/share/mylog
export MY_DEFAULT_LOG_LEVEL=URGENT

et pour tout ce que vous voulez utiliser cette configuration

  1. lancez-le depuis le shell qui a sourceed loglocation.sh dans son fichier de connexion non interactif (celui qui est lu pour tout instances de la coquille, c.-à-d. .bash_profile).
  2. écrire un script de wrapper minimal qui source loglocation.sh avant de lancer le vrai programme. launchcorelogger.sh:

 CORELOGGER=/opt/sbin/mycorelogger
 source /etc/loglocation.sh
 exec $CORELOGGER

et avoir init lance le script.

édite maintenant le script LogLocation va effectuer tous les traitements associés si leur votre course à partir d'une coquille fraîche dans le premier cas ou les redémarrer en utilisant des systèmes vous Dameon redémarrée (/etc/init.d/mycorelogger restart ou peu importe).


7
2018-02-22 15:11



Je n'essaie pas de modifier les variables env dans un processus. Je veux juste créer un ensemble de paramètres disponibles pour les applications déconnectées que j'ai créées. Par exemple, si vous avez trois applications différentes qui se connectent toutes à un dossier $ MY_CUSTOM_LOG_LOCATION, il est donc judicieux de définir cette variable pour qu'elle soit disponible "globalement". Si les trois processus sont lancés à partir d'un shell, la définition de cette variable dans .bashrc fonctionne, mais si l'un d'eux est un démon lancé au démarrage, ce processus ne voit pas la variable définie dans .bashrc. - bhavinb
Ce que j'essaye exactement de faire, c'est de définir quelques variables qui pointent vers différents dossiers utilisés par les applications et les scripts. Par exemple, un dossier de ce type indique l'emplacement de déploiement de mon application Web sur le serveur. Ceci est ensuite utilisé à travers différentes applications telles que le démon Stunnel, le fichier de configuration Rsync, les scripts Bash appelés par mon webapp Ruby-on-rails (qui, par ailleurs, ne voient pas les variables parce que l'app-serveur ssh et n'est pas démarré sur une session de session connectée Si je lance Mongrel à partir d'un shell sur le serveur, ruby ​​voit les variables). - bhavinb
La solution proposée fonctionne très bien! Cependant, ce n'est pas exactement ce que j'espérais. Cela signifie toujours que les démons système tels que CRON, SSH que j'utilise pour exécuter des scripts / commandes qui reposent sur mes variables personnalisées ne fonctionneront pas. Supposons que je veuille exécuter une commande sur SSH en disant «moins $ CORELOGGER / Masterlog», cela ne fonctionnera pas à moins que je source mon wrapper loglocation.sh avant que EVERY, y compris les démons système, ne soient initialisés. Peu douloureux ceci. - bhavinb


Je propose de mettre vos env vars dans / etc / environment. Le mien contient actuellement

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
NUKE_PATH=/spr/studio/codebase/nuke

et NUKE_PATH est défini pour les processus cron et les shell Bash.

(Malheureusement, pas pour les processus lancés par Deadline, une application de file d'attente de processus, mais c'est mon problème pas le vôtre :-)


2
2017-12-18 18:51





Cet article m'a aidé: https://help.ubuntu.com/community/EnvironmentVariables

Essentiellement, /etc/environment est bon pour les variables système et les fichiers .sh sous /etc/profile.d/ sera exécuté à chaque fois que quelqu'un se connecte via la console ou via ssh.


1
2017-09-27 08:00