49 votes

Pourquoi le fichier /etc/profile n'est-il pas chargé lors des sessions bash Shell sans connexion ?

Pour la version 11.04, j'ai procédé à une nouvelle installation de mon système. Une partie de cette installation consistait à installer rvm qui colle un rvm.sh en /etc/profile.d/ . Cela ne fonctionne pas car /etc/profile (qui charge chaque +r dans /etc/profile.d/*.sh ) n'est pas chargé. D'après la documentation, le profil n'est source que si bash est exécuté en login. Pour le vérifier, j'ai invoqué bash --login après quoi rvm était disponible.

Cela a fonctionné pour moi dans les versions précédentes d'Ubuntu sans aucune configuration. C'est-à-dire qu'une nouvelle installation de la version 10.10 va correctement sourcer profile/.d.

Ma question est la suivante : y a-t-il quelque chose que je fais mal, ou y a-t-il de nouvelles hypothèses dans Natty qui ont cassé cela ? Ma solution actuelle consiste à source /etc/profile en ~/.bashrc (ce qui est terrible car le profil est censé charger avant bashrc, mais cela fait l'affaire).

55voto

Adam Points 6342

Par défaut, gnome-terminal ne démarre pas bash en tant que login Shell (je suppose que vous voulez dire bash démarré à l'intérieur d'un gnome-terminal). Cela signifie que bash ne lira pas /etc/profile o ~/.profile . Comme vous l'avez correctement observé, bash lira ces fichiers s'il est lancé en tant que login Shell.

La solution rapide à votre problème est de configurer gnome-terminal pour qu'il démarre bash en tant que login Shell de manière à ce qu'il lise /etc/profile . Pour ce faire, vous devez activer l'option "Exécuter une commande en tant que login Shell" dans les "Préférences de profil" du terminal gnome, accessibles à partir du menu Edition.

Je ne recommande pas de le faire car cela perturbe la distinction entre ~/.profile y ~/.bashrc . Idéalement ~/.profile doit faire des choses qui ne sont requises qu'une seule fois, lors de la connexion, alors que ~/.bashrc doit faire des choses qui sont nécessaires à chaque fois que bash est démarré.

Il existe un question et réponse à superuser sur la différence entre bashrc et profile . Pour plus d'informations, lisez ce document.

D'après la description de votre problème, il semble que le rvm script ne doive être chargé qu'une seule fois, lors de la connexion. Pour autant que je sache, Ubuntu a configuré le login graphique de manière à ce qu'il lise /etc/profile/ y ~/.profile . Cela signifie qu'après s'être déconnecté et s'être reconnecté une fois, le rvm script devrait être actif. Si cela ne fonctionne toujours pas, il se peut que le rvm script doive être chargé à chaque session bash. Si c'est le cas, alors bashrc est l'endroit le plus approprié pour le script.

7voto

Dmitri Points 171

Il existe cependant un fichier /etc/bash.bashrc qui est lu par gnome-terminal et qui est le "fichier .bashrc du système pour les shells interactifs bash(1)".

Mon appel à la fonction rvm, [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" Il a été installé et fonctionne parfaitement pour les quelques utilisateurs de ce système.

4voto

alepuzio Points 101

L'installation de RVM en tant que multi-utilisateur nécessite que l'utilisateur exécute cette commande :

(parce qu'Ubuntu n'extrait pas le fichier /etc/profile.d à l'ouverture de session)

echo '[[ -s "/etc/profile.d/rvm.sh" ]] && . "/etc/profile.d/rvm.sh" # Load RVM function' >> ~/.bashrc

0voto

Mike Cage Points 131

Si vous avez ZSH ou OH-MY-ZSH, votre profil est /etc/zprofile

0voto

Pariah Points 19

J'ai trouvé pour ceux qui n'aiment pas redémarrer complètement leurs boîtes à moins que ce ne soit absolument nécessaire, ce qui suit...

Il n'est pas nécessaire de redémarrer l'ensemble de la machine pour apporter des modifications à /etc/profile prennent effet. Il vous suffit de redémarrer votre interface graphique XWindows Desktop pour qu'elle relise les configurations (comme elle le ferait si elle était démarrée dans le cadre d'un redémarrage général du système).

Pour ma part, j'utilise xUbuntu qui utilise LightDM, mais vous pouvez utiliser n'importe quel exécutable qui appelle votre bureau actuel.

Tout d'abord, vous ne pouvez pas utiliser un émulateur de terminal à partir de l'interface graphique du bureau (du moins pas avec LightDM). Vous devez utiliser SSH ou une console secondaire (si vous maintenez Ctrl + Alt et que vous appuyez sur la touche F ou sur la touche numérique, vous devriez passer de votre connexion graphique ou de votre écran à une fenêtre de terminal). Je vous suggère également de fermer tout système de bureau à distance comme VNC si vous utilisez SSH (évidemment, SSH peut être connecté, mais vous ne voulez pas qu'une fenêtre VNC ouverte interroge l'écran 0 pendant qu'elle essaie de redémarrer, car cela pourrait bloquer le redémarrage en attendant que vous mettiez fin à la session VNC).

Je fais cela tout le temps avec SSH et cela me sauve la vie, surtout lorsque vous n'êtes pas physiquement près de votre machine et que vous n'avez pas envie d'attendre un redémarrage complet et de vous reconnecter :-D

Maintenant, la partie facile une fois dans un terminal "secondaire" ou un problème SSH : (Oui, cela va tuer votre session en cours, assurez-vous que cela ne vous dérange pas, sauvegardez tous les documents ouverts ou votre travail).

sudo service lightdm restart

attendre une minute pendant qu'il tue le bureau et le redémarre (cela peut prendre quelques bonnes secondes car les choses sont arrêtées puis exécutées à nouveau au démarrage).

Voilà, maintenant quand vous retournez à la console 0 ou que vous utilisez VNC pour vous connecter à nouveau, vous serez accueilli par l'invite de connexion et vous vous connecterez normalement. Si vous ouvrez un émulateur de terminal et que vous lancez votre commande, vous ne devriez pas avoir de problèmes car tout a été ré-alimenté comme si vous aviez redémarré complètement la machine.

N'oubliez pas que si vous émettez sudo service lightdm restart [ou stop , start ou autre] à partir de l'environnement de bureau lui-même, à l'aide d'un émulateur de terminal, la commande restera bloquée et rien ne semblera se produire. Cela est dû au fait que vous êtes en train d'utiliser la console (ou l'écran) 0 et qu'elle ne peut donc pas s'éteindre et se rallumer complètement, car elle attend que le bureau ne soit plus utilisé avant d'exécuter la commande.

Dernière remarque : je n'ai pas essayé de redémarrer l'environnement à partir du bureau dans un émulateur de terminal, puis de basculer vers une autre console qui pourrait alors le redémarrer, mais si vous allez déjà changer de console, pourquoi ne pas simplement exécuter la commande à partir de là, comme cela devrait être le cas de toute façon ?

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