Назад | Перейти на главную страницу

MacOS Yosemite: работает ли установка переменной PATH в / Library / LaunchDaemon?

Я запускаю вещь, написанную на python, из списков в / Library / LaunchDaemons в Йосемити, и я хочу, чтобы она запускала несколько скриптов. И, похоже, не берет 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 ничего не показывает.

Мы обнаружили, что launchd в Йосемити добавил 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 использует последний.

Также: это почти наверняка ошибка, среда не должна содержать двух элементов с одинаковыми именами.