web-dev-qa-db-ja.com

launchd.confによる環境変数の設定は、OS X Yosemite / El Capitan / macOS Sierra / Mojaveでは機能しません。

launchd.confが私の環境変数をもう読み込まないようです。他の誰かがそれに気づいたことがありますか?

環境変数を恒久的に設定するための別の解決策はありますか?

184
Tosh

この内容でenvironment.plist~/Library/LaunchAgents/ファイルを作成します。

<?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>

<string></string>ブロック内にlaunchctlコマンドを多数追加できます。

plistはシステムの再起動後にアクティブになります。 launchctl load ~/Library/LaunchAgents/environment.plistを使ってすぐに起動することもできます。

[編集]

同じ解決策がEl Capitanでも機能します。

Xcode 7.0以降は、デフォルトでは環境変数を評価しません。このコマンドで以前の動作を有効にすることができます。

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

[編集]

これではうまくいかない場合がいくつかあります。コンピュータが再起動され、[ログイン時にウィンドウを再度開く]が選択されていると、再起動されたウィンドウに変数が表示されないことがあります(おそらくエージェントが実行される前に開かれます)。また、ssh経由でログインした場合、変数は設定されません(したがって、〜/ .bash_profileに設定する必要があります)。最後に、これはEl CapitanとSierraのPATHにはうまくいかないようです。これは 'launchctl config user path ...'と/ etc/pathsで設定する必要があります。

150
MortimerGoro

[ Original answer ]:launchctl setenv variablename valueを使用して変数を設定し、 all applications(グラフィカルアプリケーションは次の方法で起動できます)ターミナル経由で起動したものに加えて、DockまたはSpotlight。

明らかに、ログインするたびにこれをしたくないでしょう。

[ Edit ]:これを回避するには、AppleScript Editorを起動し、次のようなコマンドを入力してください。

do Shell script "launchctl setenv variablename value"

(複数の変数を設定したい場合は複数行を使用してください)

+ s)をファイル形式として保存します。アプリケーション。最後にSystem Settingsユーザーとグループログイン項目を開き、新しいアプリケーションを追加します。

[元の答え]:この場所を回避するには、短いシェルスクリプトで定義したいすべての変数を使用し、次にこれを見てください MacOSログインでスクリプトを実行する方法についての回答 。そうすれば、ユーザがログインしたときにスクリプトが呼び出されます。

[ Edit ]:変数はその特定のユーザーに対してのみ設定されるので、どちらの解決策も完璧ではありませんが、すべてがうまくいくことを願っています/推測しています必要です。

複数のユーザーがいる場合は、それぞれに手動でログイン項目を設定するか、またはcom.user.loginscript.plistのコピーを配置します。それぞれのローカルLibrary/LaunchAgentsディレクトリで、同じシェルスクリプトを指しています。

もちろん、これらの回避策はどちらも/ etc/launchd.confほど便利ではありません。

[さらに編集]:下のユーザーは、これは彼にとってうまくいかなかったと述べています。しかし、私は複数のYosemiteマシンでテストしてきました、そしてそれは私のために働きます。問題がある場合は、これを有効にするためにアプリケーションを再起動する必要があります。さらに、〜/ .profileまたは〜/ .bash_profileで端末に変数を設定すると、で設定したものが上書きされます。 アプリケーション用のlaunchctl setenvは、Shell から開始されました。

63
ruario

Mac OS X 10.10 Yosemiteでは、3つのファイルと2つのコマンドを使って環境変数を設定できます。

環境変数定義付きのメインファイル:

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

ユーザーアプリケーション用の環境変数(端末、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>

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

そして最後にこれらのサービスを登録する必要があります:

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

得られるもの:

  1. システム環境変数を宣言する唯一の場所:/ etc/environment
  2. / etc/environmentファイルの変更後の環境変数の即時自動更新 - アプリケーションを再起動するだけ

問題点/問題点:

あなたのenv変数がアプリケーションによって正しくとられるためにはシステムの再起動後にが必要になるでしょう:

  • 2回ログインする:login => logout => login
  • env変数を使用する必要がある場合は、アプリケーションを手動で閉じてから再度開きます。
  • または「ログイン時にウィンドウを再び開く」機能を使用しないでください。

これはAppleがロードされたサービスの明示的な順序付けを否定しているために起こります。そのためenv変数は "reopenキュー"の処理と並行して登録されます。

しかし実際には、私は年に数回しかシステムをリブートしません(大きなアップデートで)ので、それは大したことではありません。

21
ursa

から引用

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

多くの検討の末、エンジニアリングはこの機能を削除しました。セキュリティ上の理由から、ファイル/etc/launchd.confは意図的に削除されました。回避策として、起動時の早い段階で、おそらくLaunchDaemonからlaunchctl limitをrootとして実行することができます。 (...)

溶液:

Bash-scriptでコードを/Library/LaunchDaemons/com.Apple.launchd.limit.plistに入れます。

#!/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

これは、以前の動作を復元するためのコマンドです。

# 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

これでsetenv Java_HOME /Library/Java/Home/etc/launchd.confのようなコマンドを指定できます。

El Capitanで確認しました。

3
yanchenko

私のために何がうまくいったのでしょう(aaxのおかげで)

これを/ Library/LaunchDaemons/com.Apple.launchd.limit.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>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>

ステップバイステップで必要な場合

  • 端末を起動する
  • Sudo suと入力し、パスワードを入力してrootとしてログインします。
  • タイプvi /ライブラリ/ LaunchDaemons/com.Apple.launchd.limit.plist
  • Viエディタに入ったら、キーiを押して挿入モードに入り、上記のコードの正確な内容(⌘+v)を貼り付けます。これにより、1プロセスあたり16384ファイル、合計16384ファイルに制限されます。
  • ファイルを保存してescを使用して終了し、次に:wqを使用して終了します
  • システムを再起動し、コマンドlaunchctl limitを使用してシステムが機能していることを確認します。

これがお役に立てば幸いです。

2
Baptiste

あなたは https://github.com/ersiner/osx-env-sync 試してみることができます。 シングルソースからコマンドラインとGUIアプリケーションの両方を処理し、OS Xの最新バージョン(ヨセミテ)と一緒に動作します。

あなたが書いたものはそもそもbashによって供給される通常のbashスクリプトなので、パス置換や他のシェルトリックを使うことができます。制限はありません。( osx-env-sync ドキュメントを確認してください。これがどのように達成されるか理解できます。)

私は同様の質問に答えました here あなたがもっと見つけることができるところ。

2
Ersin Er