MacOS Yosemite: работает ли установка переменной PATH в /Library/LaunchDaemon?
Я запускаю вещь, написанную на python, из списков в /Library/LaunchDaemons в Yosemite и хочу, чтобы она запускала несколько сценариев. И, кажется, не брать 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
тогда я бы ожидал, что это покажет /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
в /var/log/foo/stdout.log
как PATH
, Однако только /usr/bin:/bin:/usr/sbin:/sbin
показывает там.
У меня также есть / usr / local / bin / usr / bin / bin / usr / sbin / sbin
в /etc/paths
а также setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin в /etc/launchd.conf, но все равно не работает. launchctl getenv PATH
ничего не показывает
1 ответ
Мы обнаружили, что launchd в Yosemite добавил 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=/usr/bin:/bin:/usr/sbin:/sbin
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Питон, видимо, взял первый. Обходной путь - запуск программы из скрипта bash, поскольку кажется, что bash использует последний.
Кроме того: это почти наверняка ошибка, среда не должна содержать два элемента с одинаковыми именами.