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 для возможного исправления.