Définition des variables d’environnement via launchd.conf ne fonctionne plus dans OS X Yosemite / El Capitan / macOS Sierra?

Il semble que launchd.conf ne charge plus ma variable d’environnement. Est-ce que quelqu’un d’autre l’a remarqué?

Existe-t-il une autre solution pour définir de manière permanente les variables d’environnement?

Créez un fichier environment.plist dans ~/Library/LaunchAgents/ avec ce contenu:

     Label my.startup ProgramArguments  sh -c  launchctl setenv PRODUCTS_PATH /Users/mortimer/Projects/my_products launchctl setenv ANDROID_NDK_HOME /Applications/android-ndk launchctl setenv PATH $PATH:/Applications/gradle/bin   RunAtLoad    

Vous pouvez append de nombreuses commandes launchctl dans le bloc .

Le plist s’activera après le redémarrage du système. Vous pouvez également utiliser launchctl load ~/Library/LaunchAgents/environment.plist pour le lancer immédiatement.

[Modifier]

La même solution fonctionne aussi à El Capitan.

Xcode 7.0+ n’évalue pas les variables d’environnement par défaut. L’ancien comportement peut être activé avec cette commande:

defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO

[Modifier]

Il y a quelques situations où cela ne fonctionne pas vraiment. Si l’ordinateur est redémarré et que l’option “Rouvrir Windows lorsque vous vous reconnectez” est sélectionnée, les fenêtres réouvertes risquent de ne pas voir les variables (elles sont peut-être ouvertes avant l’exécution de l’agent). De plus, si vous vous connectez via ssh, les variables ne seront pas définies (vous devrez donc les définir dans ~ / .bash_profile). Finalement, cela ne semble pas fonctionner pour PATH sur El Capitan et Sierra. Cela doit être défini via le chemin utilisateur launchctl config … et dans / etc / path.

[ Réponse originale ]: Vous pouvez toujours utiliser la launchctl setenv variablename value pour définir une variable afin qu’elle soit captée par toutes les applications (applications graphiques lancées via le Dock ou Spotlight, en plus de celles lancées via le terminal).

De toute évidence, vous ne voudrez pas le faire chaque fois que vous vous connectez.

[ Edit ]: pour éviter cela, lancez AppleScript Editor , entrez une commande comme celle-ci:

 do shell script "launchctl setenv variablename value" 

(Utilisez plusieurs lignes si vous souhaitez définir plusieurs variables)

Maintenant, sauvegardez ( + s ) comme format de fichier: Application . Enfin, ouvrez System SettingsUtilisateurs et groupesÉléments de connexion et ajoutez votre nouvelle application.

[ Réponse originale ]: Pour contourner cet endroit, toutes les variables que vous souhaitez définir dans un court script de shell, puis jetez un coup d’œil à cette réponse précédente sur la façon d’exécuter un script lors de la connexion MacOS . De cette façon, le script sera appelé lorsque l’utilisateur se connecte.

[ Edit ]: Aucune des deux solutions n’est parfaite, car les variables ne seront définies que pour cet utilisateur spécifique, mais j’espère / devine que cela peut être tout ce dont vous avez besoin.

Si vous avez plusieurs utilisateurs, vous pouvez soit définir manuellement un élément de connexion pour chacun d’eux, soit placer une copie de com.user.loginscript.plist dans chacun de leurs répertoires locaux Library / LaunchAgents , en indiquant le même script de shell.

Certes, aucune de ces solutions de contournement n’est aussi pratique que /etc/launchd.conf .

[ Edit supplémentaire ]: Un utilisateur ci-dessous mentionne que cela n’a pas fonctionné pour lui. Cependant, j’ai testé sur plusieurs machines Yosemite et cela fonctionne pour moi. Si vous rencontrez un problème, rappelez-vous que vous devrez redémarrer les applications pour que cela prenne effet. De plus, si vous définissez des variables dans le terminal via ~ / .profile ou ~ / .bash_profile , elles remplaceront les parameters définis via launchctl setenv pour les applications démarrées à partir du shell .

Il est possible de définir des variables d’environnement sur Mac OS X 10.10 Yosemite avec 3 fichiers + 2 commandes.

Fichier principal avec définition des variables d’environnement:

 $ ls -la /etc/environment -r-xr-xr-x 1 root wheel 369 Oct 21 04:42 /etc/environment $ cat /etc/environment #!/bin/sh set -e syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - start" launchctl setenv JAVA_HOME /usr/local/jdk1.7 launchctl setenv MAVEN_HOME /opt/local/share/java/maven3 if [ -x /usr/libexec/path_helper ]; then export PATH="" eval `/usr/libexec/path_helper -s` launchctl setenv PATH $PATH fi osascript -e 'tell app "Dock" to quit' syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - complete" 

Définition du service pour charger les variables d’environnement pour les applications utilisateur (terminal, IDE, …):

 $ ls -la /Library/LaunchAgents/environment.user.plist -rw------- 1 root wheel 504 Oct 21 04:37 /Library/LaunchAgents/environment.user.plist $ sudo cat /Library/LaunchAgents/environment.user.plist     Label environment.user ProgramArguments  /etc/environment  KeepAlive  RunAtLoad  WatchPaths  /etc/environment    

La même définition de service pour les applications utilisateur root:

 $ ls -la /Library/LaunchDaemons/environment.plist -rw------- 1 root wheel 499 Oct 21 04:38 /Library/LaunchDaemons/environment.plist $ sudo cat /Library/LaunchDaemons/environment.plist     Label environment ProgramArguments  /etc/environment  KeepAlive  RunAtLoad  WatchPaths  /etc/environment    

Et enfin, nous devrions enregistrer ces services:

 $ launchctl load -w /Library/LaunchAgents/environment.user.plist $ sudo launchctl load -w /Library/LaunchDaemons/environment.plist 

Ce que nous obtenons:

  1. Le seul endroit pour déclarer des variables d’environnement système: / etc / environment
  2. Mise à jour automatique instantanée des variables d’environnement après modification du fichier / etc / environment – relancez simplement votre application

Problèmes / problèmes:

Pour que vos variables env soient correctement sockets en charge par les applications après le redémarrage du système, vous aurez besoin de:

  • soit vous connecter deux fois: login => logout => login
  • ou fermer et rouvrir les applications manuellement, où les variables env doivent être sockets
  • ou n’utilisez PAS la fonctionnalité “Rouvrir les fenêtres lors de la connexion”.

Cela est dû au fait qu’Apple refuse le classement explicite des services chargés, de sorte que les variables env sont enregistrées parallèlement au traitement de la “queue de réouverture”.

Mais en fait, je ne redémarre mon système que plusieurs fois par an (sur les grandes mises à jour), donc ce n’est pas grave.

Cité de

Apple Developer Relations 10-Oct-2014 09:12 PM

Après de nombreuses délibérations, l’ingénierie a supprimé cette fonctionnalité. Le fichier /etc/launchd.conf été volontairement supprimé pour des raisons de sécurité. Pour contourner ce launchctl limit , vous pouvez exécuter launchctl limit tant que root lors du démarrage, peut-être depuis un LaunchDaemon . (…)

Solution:

Placez le code dans /Library/LaunchDaemons/com.apple.launchd.limit.plist en bash-script:

 #!/bin/bash echo '    Label eicar ProgramArguments  /bin/launchctl limit core unlimited  RunAtLoad  ServiceIPC   ' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist 

Voici les commandes pour restaurer l’ancien comportement:

 # create a script that calls launchctl iterating through /etc/launchd.conf echo '#!/bin/sh while read line || [[ -n $line ]] ; do launchctl $line ; done < /etc/launchd.conf; ' > /usr/local/bin/launchd.conf.sh # make it executable chmod +x /usr/local/bin/launchd.conf.sh # launch the script at startup echo '    Label launchd.conf ProgramArguments  sh -c /usr/local/bin/launchd.conf.sh  RunAtLoad    ' > /Library/LaunchAgents/launchd.conf.plist 

Vous pouvez maintenant spécifier des commandes comme setenv JAVA_HOME /Library/Java/Home dans /etc/launchd.conf .

Vérifié sur El Capitan.

Qu’est-ce qui a fonctionné pour moi (inspiré de aax ‘merci):

Collez ceci dans /Library/LaunchDaemons/com.apple.launchd.limit.plist puis redémarrez:

     Label eicar ProgramArguments  /bin/launchctl limit maxfiles 16384 16384  RunAtLoad  ServiceIPC    

Si vous en avez besoin pas à pas:

  • Terminal de lancement
  • Tapez sudo su puis entrez votre mot de passe pour vous connecter en tant que root
  • Tapez vi /Library/LaunchDaemons/com.apple.launchd.limit.plist
  • Lorsque vous êtes dans l’éditeur vi, appuyez sur la touche i pour accéder au mode d’insertion, puis collez le contenu exact du code ci-dessus ( ⌘+v ). Cela forcera la limite à 16384 fichiers par processus et 16384 fichiers au total
  • Sauvegardez votre fichier et quittez en utilisant alors esc :wq
  • Redémarrez votre système et vérifiez qu’il fonctionne avec la commande launchctl limit

J’espère que cela vous a aidé.

Vous pouvez donner https://github.com/ersiner/osx-env-sync un essai. Il gère les applications de ligne de commande et d’interface graphique à partir d’une source unique et fonctionne avec la dernière version d’OS X (Yosemite).

Vous pouvez utiliser des substitutions de chemin et d’autres astuces de shell car ce que vous écrivez est un script bash régulier qui doit être généré par bash en premier lieu. Aucune ressortingction .. (Consultez la documentation osx-env-sync et vous comprendrez comment cela se passe.)

J’ai répondu à une question similaire ici où vous en trouverez plus.

La solution consiste à append votre variable à /etc/profile . Alors tout fonctionne comme prévu! Bien sûr, vous devez le faire en tant qu’utilisateur root avec sudo nano / etc / profile. Si vous le modifiez d’une autre manière, le système se plaindra d’un fichier / etc / endommagé, même si vous modifiez les permissions pour root.

J’ai ajouté les variables dans le fichier ~ / .bash_profile de la manière suivante. Une fois que vous avez terminé, redémarrez / déconnectez-vous et connectez-vous

 export M2_HOME=/Users/robin/softwares/apache-maven-3.2.3 export ANT_HOME=/Users/robin/softwares/apache-ant-1.9.4 launchctl setenv M2_HOME $M2_HOME launchctl setenv ANT_HOME $ANT_HOME export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/robin/softwares/apache-maven-3.2.3/bin:/Users/robin/softwares/apache-ant-1.9.4/bin launchctl setenv PATH $PATH 

REMARQUE: sans redémarrage / déconnexion et connexion, vous pouvez appliquer ces modifications à l’aide de;

 source ~/.bash_profile