wake-up-neo.net

Das Setzen von Umgebungsvariablen über launchd.conf funktioniert unter OS X nicht mehr. Yosemite / El Capitan / macOS Sierra / Mojave?

Es sieht aus wie das launchd.conf lädt meine Umgebungsvariable nicht mehr. Hat das noch jemand bemerkt?

Gibt es eine andere Lösung, um Umgebungsvariablen dauerhaft festzulegen?

185
Tosh

Erstellen Sie eine environment.plist - Datei in ~/Library/LaunchAgents/ Mit folgendem Inhalt:

<?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">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>
    launchctl setenv PRODUCTS_PATH /Users/mortimer/Projects/my_products
    launchctl setenv Android_NDK_HOME /Applications/Android-ndk
    launchctl setenv PATH $PATH:/Applications/gradle/bin
    </string>

  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Sie können viele launchctl Befehle innerhalb des <string></string> Blocks hinzufügen.

Das plist wird nach dem Neustart des Systems aktiviert. Sie können es auch mit launchctl load ~/Library/LaunchAgents/environment.plist Sofort starten.

[Bearbeiten]

Die gleiche Lösung funktioniert auch in El Capitan.

Xcode 7.0+ wertet standardmäßig keine Umgebungsvariablen aus. Das alte Verhalten kann mit diesem Befehl aktiviert werden:

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

[Bearbeiten]

Es gibt einige Situationen, in denen dies nicht ganz funktioniert. Wenn der Computer neu gestartet wird und "Fenster beim erneuten Anmelden erneut öffnen" ausgewählt ist, werden die Variablen möglicherweise nicht in den neu geöffneten Fenstern angezeigt (möglicherweise werden sie geöffnet, bevor der Agent ausgeführt wird). Wenn Sie sich über ssh anmelden, werden die Variablen nicht festgelegt (Sie müssen sie daher in ~/.bash_profile festlegen). Schließlich scheint dies bei PATH auf El Capitan und Sierra nicht zu funktionieren. Dies muss über 'launchctl config user path ...' und in/etc/arrows eingestellt werden.

151
MortimerGoro

[ Ursprüngliche Antwort ]: Sie können immer noch launchctl setenv variablename value, um eine Variable festzulegen, die von allen Anwendungen (grafische Anwendungen, die über Dock oder Spotlight gestartet wurden, zusätzlich zu denen, die über das Terminal gestartet wurden) aufgenommen wird ).

Natürlich möchten Sie dies nicht jedes Mal tun, wenn Sie sich anmelden.

[ Bearbeiten ]: Um dies zu vermeiden, starten Sie AppleScript Editor, gib einen Befehl wie diesen ein:

do Shell script "launchctl setenv variablename value"

(Verwenden Sie mehrere Zeilen, wenn Sie mehrere Variablen festlegen möchten.)

Nun speichere ( + s) as Dateiformat: Anwendung. Endlich offen System Settings Benutzer & Gruppen Anmeldeobjekte und fügen Sie Ihre neue Anwendung hinzu.

[ Ursprüngliche Antwort ]: Um dieses Problem zu umgehen, platzieren Sie alle Variablen, die Sie definieren möchten, in einem kurzen Shell-Skript. Schauen Sie sich dann Folgendes an: vorherige Antwort zum Ausführen eines Skripts unter MacOS login . Auf diese Weise wird das Skript aufgerufen, wenn sich der Benutzer anmeldet.

[ Bearbeiten ]: Keine der beiden Lösungen ist perfekt, da die Variablen nur für diesen spezifischen Benutzer festgelegt werden, aber ich hoffe Ich schätze, das ist alles, was du brauchst.

Wenn Sie mehrere Benutzer haben, können Sie entweder manuell Login Item für jeden von ihnen festlegen oder eine Kopie von com.user.loginscript.plist in jeden von ihnen einfügen der lokalen Library/LaunchAgents Verzeichnisse, die auf dasselbe Shell-Skript verweisen.

Zugegeben, keine dieser Problemumgehungen ist so praktisch wie /etc/launchd.conf.

[ Further Edit ]: Ein Benutzer unten erwähnt, dass dies für ihn nicht funktioniert hat. Ich habe jedoch auf mehreren Yosemite-Maschinen getestet und es funktioniert für mich. Wenn Sie ein Problem haben, denken Sie daran, dass Sie Anwendungen neu starten müssen, damit dies wirksam wird. Wenn Sie zusätzlich Variablen im Terminal über ~/.profile oder ~/.bash_profile setzen, überschreiben sie die über launchctl setenv für Anwendungen, die über die Shell gestartet wurden .

63
ruario

Unter Mac OS X 10.10 Yosemite können Umgebungsvariablen mit 3 Dateien + 2 Befehlen festgelegt werden.

Hauptdatei mit Definition der Umgebungsvariablen:

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

Dienstdefinition zum Laden von Umgebungsvariablen für Benutzeranwendungen (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
<?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">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>environment.user</string>
    <key>ProgramArguments</key>
    <array>
            <string>/etc/environment</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment</string>
    </array>
</dict>
</plist>

Dieselbe Dienstdefinition für Root-Benutzeranwendungen:

$ 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">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>environment</string>
    <key>ProgramArguments</key>
    <array>
            <string>/etc/environment</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment</string>
    </array>
</dict>
</plist>

nd zum Schluss sollten wir diese Dienste registrieren:

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

Was wir bekommen:

  1. Der einzige Ort, an dem Systemumgebungsvariablen deklariert werden können:/etc/environment
  2. Sofortige automatische Aktualisierung von Umgebungsvariablen nach Änderung der Datei/etc/environment - starten Sie einfach Ihre Anwendung neu

Probleme:

Damit Ihre Umgebungsvariablen von Anwendungen korrekt übernommen wurden nach dem Neustart des Systems benötigen Sie:

  • entweder zweimal einloggen: login => logout => login
  • oder Anwendungen manuell schließen und erneut öffnen, wobei Umgebungsvariablen verwendet werden sollten
  • oder NICHT die Funktion "Fenster beim Zurückmelden erneut öffnen" verwenden.

Dies ist darauf zurückzuführen, dass Apple die explizite Bestellung geladener Dienste verweigert, sodass Umgebungsvariablen parallel zur Verarbeitung der "Wiedereröffnungswarteschlange" registriert werden.

Tatsächlich starte ich mein System jedoch nur mehrmals im Jahr neu (bei großen Aktualisierungen), sodass es keine große Sache ist.

21
ursa

Zitiert von

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

Nach langem Überlegen hat das Engineering diese Funktion entfernt. Die Datei /etc/launchd.conf Wurde aus Sicherheitsgründen absichtlich entfernt. Um dieses Problem zu umgehen, können Sie launchctl limit Frühzeitig während des Startvorgangs als root ausführen, möglicherweise von einem LaunchDaemon aus. (...)

Lösung:

Fügen Sie den Code per Bash-Skript in /Library/LaunchDaemons/com.Apple.launchd.limit.plist Ein:

#!/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">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>eicar</string>
        <key>ProgramArguments</key>
        <array>
                <string>/bin/launchctl</string>
                <string>limit</string>
                <string>core</string>
                <string>unlimited</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>ServiceIPC</key>
        <false/>
</dict>
</plist>' | Sudo tee /Library/LaunchDaemons/com.Apple.launchd.limit.plist
6
aax

Hier sind die Befehle zum Wiederherstellen des alten Verhaltens:

# 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">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>/usr/local/bin/launchd.conf.sh</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
' > /Library/LaunchAgents/launchd.conf.plist

Jetzt können Sie Befehle wie setenv Java_HOME /Library/Java/Home im /etc/launchd.conf.

Überprüft auf El Capitan.

3
yanchenko

Was hat bei mir funktioniert (inspiriert von Aax 'Dank):

Fügen Sie dies in / Library/LaunchDaemons/com.Apple.launchd.limit.plist ein und starten Sie dann neu:

<?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">
  <plist version="1.0">
  <dict>
  <key>Label</key>
  <string>eicar</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/launchctl</string>
    <string>limit</string>
    <string>maxfiles</string>
    <string>16384</string>
    <string>16384</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>ServiceIPC</key>
  <false/>
</dict>
</plist>

Wenn Sie es Schritt für Schritt brauchen:

  • Terminal starten
  • Geben Sie Sudo s ein und geben Sie Ihr Passwort ein, um sich als root anzumelden
  • Geben Sie vi /Library/LaunchDaemons/com.Apple.launchd.limit.plist ein
  • Drücken Sie im vi-Editor die Taste i, um in den Einfügemodus zu wechseln, und fügen Sie dann den genauen Code-Inhalt oben ein (⌘+v). Dadurch wird die Beschränkung auf 16384 Dateien pro Prozess und 16384 Dateien insgesamt erzwungen
  • Speichern Sie Ihre Datei und beenden Sie sie mit esc und dann :wq
  • Starten Sie Ihr System neu und überprüfen Sie, ob es funktioniert. Verwenden Sie dazu den Befehl launchctl limit

Ich hoffe das hat dir geholfen.

2
Baptiste

Sie können https://github.com/ersiner/osx-env-sync ausprobieren. Es verarbeitet sowohl Befehlszeilen- als auch GUI-Apps aus einer einzigen Quelle und funktioniert mit der neuesten Version von OS X (Yosemite).

Sie können Pfadsubstitutionen und andere Shell-Tricks verwenden, da das, was Sie schreiben, ein reguläres Bash-Skript ist, das zuerst von Bash bezogen wird. Keine Einschränkungen. (Lesen Sie osx-env-sync Dokumentation und Sie werden verstehen, wie dies erreicht wird.)

Ich habe eine ähnliche Frage beantwortet hier wo Sie mehr finden.

2
Ersin Er