L’impostazione delle variabili d’ambiente tramite launchd.conf non funziona più con OS X Yosemite / El Capitan / macOS Sierra?

Sembra che launchd.conf non carichi più la mia variabile di ambiente. Qualcun altro l’ha notato?

C’è un’altra soluzione per impostare in modo permanente le variabili di ambiente?

Crea un file environment.plist in ~/Library/LaunchAgents/ con questo contenuto:

 < ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">   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    

Puoi aggiungere molti comandi launchctl all’interno del blocco .

Il plist si attiverà dopo il riavvio del sistema. Puoi anche utilizzare launchctl load ~/Library/LaunchAgents/environment.plist per launchctl load ~/Library/LaunchAgents/environment.plist immediatamente.

[Modificare]

La stessa soluzione funziona anche a El Capitan.

Xcode 7.0+ non valuta le variabili di ambiente per impostazione predefinita. Il vecchio comportamento può essere abilitato con questo comando:

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

[Modificare]

Ci sono un paio di situazioni in cui questo non funziona. Se il computer viene riavviato e viene selezionato “Riapri windows quando si effettua il login”, le windows riaperte potrebbero non visualizzare le variabili (potrebbero essere aperte prima dell’esecuzione dell’agente). Inoltre, se si accede tramite ssh, le variabili non verranno impostate (quindi sarà necessario impostarle in ~ / .bash_profile). Infine, questo non sembra funzionare per PATH su El Capitan e Sierra. Questo deve essere impostato tramite ‘launchctl config user path …’ e in / etc / paths.

[ Risposta originale ]: è comunque ansible utilizzare il launchctl setenv variablename value per impostare una variabile in modo che venga rilevata da tutte le applicazioni (applicazioni grafiche avviate tramite il Dock o Spotlight, oltre a quelle avviate tramite il terminale).

Ovviamente non vorrai farlo ogni volta che effettui il login.

[ Modifica ]: per evitare ciò, avvia AppleScript Editor , inserisci un comando come questo:

 do shell script "launchctl setenv variablename value" 

(Usa più righe se vuoi impostare più variabili)

Ora salva ( + s ) come Formato file: Applicazione . Finalmente apri System SettingsUtenti e gruppiElementi di login e aggiungi la tua nuova applicazione.

[ Risposta originale ]: per aggirare questo luogo tutte le variabili che desideri definire in uno script di shell breve, quindi dare un’occhiata a questa risposta precedente su come eseguire uno script sul login MacOS . In questo modo lo script verrà richiamato quando l’utente esegue l’accesso.

[ Modifica ]: Nessuna delle due soluzioni è perfetta in quanto le variabili verranno impostate solo per quell’utente specifico, ma spero che sia tutto ciò che ti serve.

Se si dispone di più utenti, è ansible impostare manualmente un elemento di accesso per ognuno di essi oppure inserire una copia di com.user.loginscript.plist in ognuna delle proprie directory Library / LaunchAgents locali, puntando allo stesso script di shell.

Certo, nessuna di queste soluzioni alternative è comoda come /etc/launchd.conf .

[ Ulteriore modifica ]: un utente di seguito menziona che questo non ha funzionato per lui. Comunque ho provato su più macchine Yosemite e funziona per me. Se si verifica un problema, ricordare che sarà necessario riavviare le applicazioni affinché ciò abbia effetto. Inoltre, se si impostano le variabili nel terminale tramite ~ / .profile o ~ / .bash_profile , esse sovrascriveranno le cose impostate tramite launchctl setenv per le applicazioni avviate dalla shell .

È ansible impostare le variabili di ambiente su Mac OS X 10.10 Yosemite con 3 file + 2 comandi.

File principale con definizione delle variabili di ambiente:

 $ 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" 

Definizione del servizio per caricare le variabili d’ambiente per le applicazioni utente (terminale, 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 < ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">   Label environment.user ProgramArguments  /etc/environment  KeepAlive  RunAtLoad  WatchPaths  /etc/environment    

La stessa definizione di servizio per le applicazioni utente 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 < ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">   Label environment ProgramArguments  /etc/environment  KeepAlive  RunAtLoad  WatchPaths  /etc/environment    

E infine dovremmo registrare questi servizi:

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

Cosa otteniamo:

  1. L’unico posto in cui dichiarare le variabili di ambiente del sistema: / etc / environment
  2. Aggiornamento automatico istantaneo delle variabili di ambiente dopo la modifica del file / etc / environment – basta riavviare l’applicazione

Problemi / problemi:

Nell’ordine in cui le tue variabili env sono state prese correttamente dalle applicazioni dopo il riavvio del sistema, avrai bisogno di:

  • o accedi due volte: login => logout => login
  • o chiudere e riaprire le applicazioni manualmente, dove le variabili env dovrebbero essere prese
  • oppure NON utilizzare la funzionalità “Riapri windows quando si effettua il login”.

Ciò accade a causa di Apple nega l’ordine esplicito dei servizi caricati, quindi le variabili env vengono registrate in parallelo con l’elaborazione della “coda di riapertura”.

Ma in realtà, riavvio il mio sistema solo più volte all’anno (su grandi aggiornamenti), quindi non è un grosso problema.

Citato da

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

Dopo molte discussioni, l’ingegneria ha rimosso questa funzione. Il file /etc/launchd.conf stato intenzionalmente rimosso per motivi di sicurezza. Come soluzione alternativa, è ansible eseguire il launchctl limit come root all’inizio durante l’avvio, forse da un LaunchDaemon . (…)

Soluzione:

Inserisci il codice in /Library/LaunchDaemons/com.apple.launchd.limit.plist tramite bash-script:

 #!/bin/bash echo '< ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">   Label eicar ProgramArguments  /bin/launchctl limit core unlimited  RunAtLoad  ServiceIPC   ' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist 

Ecco i comandi per ripristinare il vecchio comportamento:

 # 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 '< ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">   Label launchd.conf ProgramArguments  sh -c /usr/local/bin/launchd.conf.sh  RunAtLoad    ' > /Library/LaunchAgents/launchd.conf.plist 

Ora puoi specificare comandi come setenv JAVA_HOME /Library/Java/Home in /etc/launchd.conf .

Controllato su El Capitan.

Cosa ha funzionato per me (ispirato da aax ‘grazie):

Incolla questo in /Library/LaunchDaemons/com.apple.launchd.limit.plist, quindi riavvia:

 < ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">   Label eicar ProgramArguments  /bin/launchctl limit maxfiles 16384 16384  RunAtLoad  ServiceIPC    

Se ne hai bisogno passo dopo passo:

  • Terminale di lancio
  • Digita sudo su poi inserisci la tua password per accedere come root
  • Digitare vi /Library/LaunchDaemons/com.apple.launchd.limit.plist
  • Quando si entra nell’editor vi, premere il tasto i per accedere alla modalità di inserimento, quindi incollare il contenuto del codice esatto sopra ( ⌘+v ). Ciò imporrà il limite a 16384 file per processo e 16384 file in totale
  • Salva il tuo file e chiudi usando esc poi :wq
  • Riavvia il sistema e verifica che funzioni utilizzando il limite del comando launchctl

Spero che questo ti abbia aiutato.

Puoi provare https://github.com/ersiner/osx-env-sync . Gestisce sia la linea di comando che le applicazioni GUI da una singola fonte e funziona con l’ ultima versione di OS X (Yosemite).

Puoi usare le sostituzioni dei percorsi e altri trucchi di shell, dal momento che ciò che scrivi è uno script di bash regolare che deve essere originato da bash in primo luogo. Nessuna restrizione. (Controlla la documentazione di osx-env-sync e capirai come raggiunge questo.)

Ho risposto a una domanda simile qui dove troverai di più.

La soluzione è aggiungere la tua variabile a /etc/profile . Quindi tutto funziona come previsto! Ovviamente DEVI farlo come utente root con sudo nano / etc / profile. Se lo si modifica in un altro modo, il sistema si lamenterà con un profilo / etc / profile danneggiato, anche se si modificano le autorizzazioni su root.

Ho aggiunto le variabili nel ~ / .bash_profile nel modo seguente. Dopo aver terminato il riavvio / disconnessione e accedi

 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 

NOTA: senza riavvio / disconnessione e accesso è ansible applicare queste modifiche utilizzando;

 source ~/.bash_profile