Скрипт работает нормально в терминале, но не из launchd

Мой скрипт Python отлично работает в терминале, но когда я пытаюсь настроить его запуск один раз в день в определенное время с помощью launchd (настроенного с помощью программного обеспечения под названием Lingon), я просто не могу запустить его. Из всего, что я прочитал, лучше вызывать сценарий Python из сценария оболочки (я работаю на Macbook, использую Yosemite). Вот что я пытаюсь сделать. Ошибки, которые я получаю, когда должен быть запущен скрипт:

TERM переменная окружения не установлена.

env: python3: нет такого файла или каталога

На данный момент, я почти уверен, что это проблема окружающей среды, но независимо от того, что я пытаюсь, я просто не могу заставить его работать. Кстати, я могу заставить скрипт оболочки работать по расписанию следующим образом:

#!/bin/bash
echo "hello world."

Проблема возникает, когда я пытаюсь запустить это:

#!/bin/bash
/Users/jeff/Documents/scripts/my_script.py

Кроме того, даже несмотря на то, что я давно работаю с компьютерами, я все еще довольно неосведомлен о многих вещах, поэтому, пожалуйста, скажите мне, как это исправить, как будто я новичок.

2 ответа

Решение

Я перепробовал все, что было упомянуто, отдельное спасибо Падрайку, но, похоже, ничего не работает. Это странно, потому что скрипт отлично работает при запуске из терминала, но выдает ошибки при запуске из launchd. Я смог избавиться от ошибок при запуске из launchd, но тогда скрипт не запускался из терминала. Очень странно. Но вот как я запустил его в терминале и по расписанию из launchd. Во-первых, я изменил строку Шебанга из этого:

#!/usr/bin/env python3

к этому:

#!/usr/bin/env /Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4

Затем мне пришлось указать в оставшейся части скрипта полный путь к файлам, например, из этого:

log = open('log_directory/my_log.log', 'a')

к этому:

log = open('/Users/jeff/documents/my_script_documents/python/development/log_directory/my_log.log', 'a')

В любом случае, теперь все работает, но я считаю, что проблема, с которой я столкнулся, может быть связана с обновлением моего Mac до ОС Yosemite. Есть некоторые упоминания о возможной ошибке в Yosemite относительно launchd / launchd.conf / launchctl. Ну, я хотел бы верить, что это не я последние 4 дня пытался заставить это работать... но кто знает?

Основываясь на этой статье, вам нужно создать.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>
    <!-- The label should be the same as the filename without the extension -->
    <string>org.yourusername.my_script-test</string>
    <!-- Specify how to run your program here -->
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/python3</string>
        <string>/Users/jeff/Documents/scripts/my_script.py</string>
    </array>
    <!-- Run every hour -->
    <key>StartInterval</key>
    <integer>3600</integer><!-- seconds -->
</dict>
</plist>

Затем:

$ launchctl load ~/Library/org.yourusername.my_script-test.plist
$ launchctl start org.yourusername.my_script-test

Статья здесь охватывает переменные среды

Другие вопросы по тегам