OS X 10.10.3 launchctl В доступе отказано

Я исполняю launchctl start com.xxx.xxx.plist

я могу найти AutoMakeLog.err и содержание:

Traceback (most recent call last):
File "/Users/xxxx/Downloads/Kevin/auto.py", line 67, in <module>
output = open(file_name, 'w')
IOError: [Errno 13] Permission denied: '2015-04-22-09:15:40.log'

содержание plist:

<array>
  <string>/Users/xxxx/Downloads/Kevin/auto.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
    <key>Minute</key>
    <integer>30</integer>
    <key>Hour</key>
    <integer>08</integer>
</dict>
<key>StandardOutPath</key>
<string>/Users/xxxx/Downloads/Kevin/AutoMakeLog.log</string>
<key>StandardErrorPath</key>
<string>/Users/xxx/Downloads/Kevin/AutoMakeLog.err</string>

auto.sh

#!/bin/sh
/usr/bin/python /Users/xxxx/Downloads/Kevin/auto.py

auto.py

file_name = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time()))
file_name += '.log'
output = open(file_name, 'w')
output.writelines(response.text)
output.close()

у auto.sh и auto.py есть chomd 777

PS: я направляю выполнение auto.sh нет ничего ошибочного.

2 ответа

Решение

Даже пользовательский launchd задания на OSX выполняются с / в качестве текущего каталога.

поскольку auto.py создает файл с простым именем файла, без пути, он эффективно пытается создать файл в / и терпит неудачу из-за недостаточных привилегий.

Таким образом, либо перейдите в каталог, в котором текущий пользователь может создавать файлы, либо укажите явный путь; например (при условии import os):

file_name = os.getenv('HOME') + '/' + time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time()))

Что касается того, как вы можете запустить свой python сценарии напрямую, без необходимости использования промежуточного сценария оболочки:

В вашем файле plist укажите команду для выполнения следующим образом:

  <key>ProgramArguments</key>
  <array>
    <string>python</string>
    <string>/Users/xxxx/Downloads/Kevin/auto.py</string>
  </array>

Обратите внимание, что вам не нужно указывать путь для python потому что это в $PATH когда launchd управляет вашей работой

Тем не менее, обратите внимание, что $PATH содержит меньше записей, чем вы видите в Terminal и заметное отсутствие /user/local/bin; значение (по состоянию на OSX 10.10.3):

/usr/bin:/bin:/usr/sbin:/sbin

Я добавляю этот ответ для наглядности, хотя исходная проблема в этом вопросе не была.

Из-за изменений в macOS 10.14 Мохаве launchd Команды теперь имеют больше ограничений безопасности. Если ты видишь Permission denied ошибки для файлов и каталогов, принадлежащих вашему пользователю, а затем см. Вопрос: Как предоставить root-доступ к файлам пользователя в Mojave для возможного исправления.

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