我使用Yosemite的/ Library / LaunchDaemons中的plists启动了一个用python编写的东西,我希望它运行一些scripots。 而且似乎没有把PATH从plist文件中提取出来。 例如,如果我在/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
那么我希望它将/var/log/foo/stdout.log
中的/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
显示为PATH
。 但是只有/usr/bin:/bin:/usr/sbin:/sbin
显示在那里。
我也有/ usr / local / bin / usr / bin / bin / usr / sbin / sbin
/etc/launchd.conf中的/etc/paths
和setenv PATH / usr / local / bin:/ usr / bin:/ bin:/ usr / sbin:/ sbin,但仍然无效。 launchctl getenv PATH
什么都不显示。
我们发现,在优胜美地推出的PATHjoin了环境,但没有删除以前的一个。 以下代码:
#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使用最后一个。
另外:这几乎肯定是一个bug,环境不应该包含两个同名的项目。