MacOS Yosemite:在 /Library/LaunchDaemon 中设置 PATH 变量是否有效?

MacOS Yosemite:在 /Library/LaunchDaemon 中设置 PATH 变量是否有效?

我从 Yosemite 中 /Library/LaunchDaemons 中的 plists 启动了一个用 python 编写的东西,我想让它运行一些脚本。但它似乎没有从 plist 文件中获取 PATH。例如,如果我有这个/Library/LaunchDaemons/com.foo.foo.plist

<plist version="1.0">
<dict>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>cz.foo.foo</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/foomac/foo.py</string>
    </array>
    <key>EnvironmentVariables</key>
    <dict>
        <key>PATH</key>
        <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>WorkingDirectory</key>
    <string>/opt/foomac/</string>
    <key>UserName</key>
    <string>administrator</string>
    <key>RunAtLoad</key>
    <true/>
    <key>SessionCreate</key>
    <false/>
    <key>StandardOutPath</key>
    <string>/var/log/foo/stdout.log</string>
    <key>StandardErrorPath</key>
    <string>/var/log/foo/stderr.log</string>
</dict>
</plist>

我的/opt/foomac/foo.py

#!/usr/bin/env python
import os
print os.environ

那么我希望它显示/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin/var/log/foo/stdout.logas中PATH。然而只/usr/bin:/bin:/usr/sbin:/sbin显示在那里。

我也有 /usr/local/bin /usr/bin /bin /usr/sbin /sbin

/etc/paths/etc/launchd.conf 中也设置了 setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 但它仍然不起作用。launchctl getenv PATH什么都没有显示。

答案1

我们发现 Yosemite 中的 launchd 会将 PATH 添加到环境中,但不会删除之前的 PATH。以下代码:

#include <stdio.h>
int main(int argc, char  * argv[], char * envp[]){
    char ** a = envp;
    while (*a != NULL){
        printf("%s\n", *a);
        a++;
    }
    return 0;
}

输出 PATH 两次:

PATH=/usr/bin:/bin:/usr/sbin:/sbin
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

Python 显然采用了第一个。一种解决方法是从 bash 脚本运行程序,因为 bash 似乎使用了最后一个。

另外:这几乎肯定是一个错误,环境不应该包含两个同名的项目。

相关内容